Resumen: Se resuelve la ecuación de Poisson en un círculo con condición de contorno de tipo Dirichlet homogénea sobre toda la frontera.
Dados
Observación: todos los cálculos que se hacen en esta sección son puramente formales, es decir, se supone siempre la regularidad suficiente para que todos ellos estén justificados.
El espacio natural para buscar la solución del problema
Para obtener la formulación variacional de
Integrando ahora por partes en el primer miembro, obtenemos
de donde, teniendo en cuenta que
La formulación variacional de
o bien, desarrollando el producto escalar
Vamos a utilizar una aproximación mediante elementos finitos
Consideramos
siendo
siendo
Sean
Una función
La base canónica de
La función
A su vez, la base de
Puesto que
Ahora bien,
de donde para obtener
Sustituyendo
Utilizando la siguiente notación
el problema
es decir el problema
Por razones de tipo informático (ver las notas sobre implementación del Método de los Elementos Finitos) construir la matriz
En consecuencia, el sistema que en la práctica se resuelve no es el anterior, sino el que se muestra a continuación, obtenido penalizando
Más concretamente, el problema
Obsérvese que lo que hemos hecho es añadir como incógnitas los valores de
Este sistema, a su vez, es equivalente a
donde
donde
En efecto, sea
y como
En resumen,
y, posteriormente, se añaden las penalizaciones descritas en
Tomaremos como dominio
Tomaremos, también,
Las siguientes instrucciones definen la frontera del dominio, utilizando sus ecuaciones paramétricas y la dibujan. Obsérvese, que hemos asignado la etiqueta 1
con el comando label = 1
a toda la curva.
// Definicion de la frontera del dominio
border C(t = 0, 2*pi){x = cos(t); y = sin(t); label = 1;};
plot(C(50), wait = 1);
Obsérvese que, para dibujar la curva x
e y
que representan, en FreeFEM, las dos variables espaciales.
Declaramos primero una variable tipo mesh
y después construimos una triangulación del dominio encerrado por la curva
// Construccion de la triangulacion
mesh Th;
Th = buildmesh(C(60));
plot(Th, wait = 1);
Definimos el espacio de elementos finitos que vamos a utilizar. Como hemos dicho antes,
// Definicion del espacio de EF
fespace Wh(Th, P1);
Declaramos y definimos la función
// Definicion de la funcion del segundo miembro
func f = x*y;
Se recuerda (ver aquí la técnica del bloqueo) que la condición de Dirichlet (
En la definición del problema variacional con FreeFEM, la ecuación variacional se escribe en forma homogénea (segundo miembro = 0).
Además, los términos bilineales y lineales no deben estar bajo la misma integral. De hecho, para construir el sistema lineal, FreeFEM averigua qué integral contribuye a la forma bilineal, comprobando si están presentes ambos, la incógnita, que aquí se denota por u
, y las funciones "test", denotadas aquí por v
.
// Declaracion de las variables del problema (elementos de Wh)
Wh u, v;
// Definicion del problema variacional:
problem MiPoisson(u, v) =
int2d(Th)(dx(u)*dx(v)+dy(u)*dy(v))
- int2d(Th)( f*v )
+ on(1, u = 0);
Aqui,
int2d
es la función de FreeFEM que sirve para calcular integrales de superficie (en dominios 2D)
int2d(Th)( expresion )
es decir
on
es la función que impone la condición de Dirichlet (bloqueo):
on(ilabel, u = u0 )
bloquea ( a u0
) el valor de la incógnita u
en los nodos de la parte de frontera con etiqueta ilabel
.
problem
es un tipo de datos que permite definir la formulación variacional que se escribe en forma homogénea (segundo miembro = 0).
problem NombrePV(u, v) = ...
donde NombrePV
es el nombre que se le da al problema variacional, en nuestro caso MiPoisson
.
Para resolver el problema, basta escribir el nombre del problema variacional:
// Resolucion
MiPoisson;
// Dibujo de la solucion
plot(u, wait = 1);
Podemos mostrar la dimensión del espacio Wh.ndof
.
// Definicion del espacio de EF
fespace Wh(Th, P1);
// Dimension de Wh
cout << " " << endl;
cout << "Dimension del espacio de elementos finitos: " + Wh.ndof << endl;
cout << " " << endl;
Las siguientes opciones de plot
son interesantes:
// Opciones del dibujo
// plot( u, fill = true, nbiso = 40, value = true, dim = 3, wait = 1);
Cada elemento u[]
. Podemos asignar los valores de la solución a un vector.
// Recuperacion de los valores de la solucion en un vector
real[int] vv = u[];
cout << vv << endl;
// se obtiene lo mismo con
cout << u[] << endl;
// Definicion de la frontera del dominio
border C(t = 0, 2*pi){x = cos(t); y = sin(t); label = 1;};
// Construccion de la triangulacion
mesh Th;
Th = buildmesh(C(60));
// Definicion del espacio de elementos
fespace Wh(Th, P1);
// Definicion de la funcion del segundo miembro
func f = x*y;
// Declaracion de las variables del problema
Wh u, v;
// Definicion del problema variacional
problem MiPoisson(u, v) =
int2d(Th)(dx(u)*dx(v)+dy(u)*dy(v))
- int2d(Th)( f*v )
+ on(1, u = 0);
// Resolucion
MiPoisson;
// Dibujo de la solucion
plot(u, wait = 1);
Se proponen los siguientes ejercicios como variantes del problema:
Anna Doubova - Rosa Echevarría - Dpto. EDAN - Universidad de Sevilla