Tengo un problema físico regido por la ecuación de Poisson en dos dimensiones Tengo mediciones de los dos componentes de gradiente ∂ u / ∂ x y ∂ u / ∂ y a lo largo de alguna parte del límite, Γ m , por lo que me gustaría imponer ∂ u
El componente de gradiente tangencial, , solo puedo integrar y luego aplicar a través de una condición de Dirichlet, de modo que ∫Γm∂u Para imponer simultáneamente el componente normal, ∂ u
Entonces creo que la forma variacional es entonces Pasé mucho tiempo tratando de reconstruirlo a partir de la información sobre problemas relacionados, como https://answers.launchpad.net/fenics/+question/212434https://answers.launchpad.net/fenics/+question / 216323
pero todavía no puedo ver a dónde me estoy equivocando. Mi intento de solución hasta ahora es:
from dolfin import *
# Create mesh and define function space
mesh = UnitSquareMesh(64, 64)
V = FunctionSpace(mesh, "Lagrange", 1)
R = FunctionSpace(mesh, "R", 0)
W = V * R
# Create mesh function over cell facets
boundary_parts = MeshFunction("uint", mesh, mesh.topology().dim()-1)
# Mark left boundary facets as subdomain 0
class LeftBoundary(SubDomain):
def inside(self, x, on_boundary):
return on_boundary and x[0] < DOLFIN_EPS
Gamma_Left = LeftBoundary()
Gamma_Left.mark(boundary_parts, 0)
class FarField(SubDomain):
def inside(self, x, on_boundary):
return on_boundary and ( (x[0] > 1.0-DOLFIN_EPS) \
or (x[1]<DOLFIN_EPS) or (x[1]> 1.0-DOLFIN_EPS) )
Gamma_FF = FarField()
Gamma_FF.mark(boundary_parts, 1)
# Define boundary condition
u0 = Expression("sin(x[1]*pi)")
bcs = [DirichletBC(V, u0, Gamma_Left)]
# Define variational problem
(u, lmbd) = TrialFunctions(W)
(v, d) = TestFunctions(W)
f = Expression("10*exp(-(pow(x[0] - 0.5, 2) + pow(x[1] - 0.5, 2)) / 0.02)")
g = Constant(0.0)
h = Constant(-4.0)
n = FacetNormal(mesh)
F = inner(grad(u), grad(v))*dx + d*dot(grad(u),n)*ds(0) + lmbd*dot(grad(v),n)*ds(0)-\
(f*v*dx + g*v*ds(1) + h*d*ds(0) + lmbd*h*ds(0))
a = lhs(F)
L = rhs(F)
# Compute solution
A = assemble(a, exterior_facet_domains=boundary_parts)
b = assemble(L, exterior_facet_domains=boundary_parts)
for bc in bcs: bc.apply(A, b)
w = Function(W)
solve(A, w.vector(), b, 'lu')
(u,lmbd) = w.split()
# Plot solution
plot(u, interactive=True)
que se ejecuta pero da un resultado ruidoso que no se parece en nada a una solución para una ecuación de Poisson. Parece tener algo que ver con los espacios de funciones combinadas, pero no puedo encontrar el error.
Agradecería cualquier ayuda o consejos en la dirección correcta. ¡Muchas gracias ya!
Saludos
Markus
fuente
Respuestas:
Primero, un punto general: no puede prescribir condiciones de límite arbitrarias para un operador diferencial parcial y esperar que la ecuación diferencial parcial (que siempre incluye tanto las condiciones de operador como las de límite) esté bien planteada, es decir, admite una solución única que depende continuamente de datos: todo lo cual es una condición necesaria para realmente tratar de calcular algo.
Dependiendo del operador, a menudo hay una serie de condiciones válidas que puede imponer (para probar, vea la monografía de tres volúmenes de Lions and Magenes). Sin embargo, lo que está tratando de hacer (especifique el gradiente completo, que es equivalente a las condiciones de Dirichlet y Neumann en el mismo límite (parte del) para un PDE elíptico de segundo orden) no está entre ellos, esto se conoce como un problema de Cauchy lateral, y está mal planteado: no hay garantía de que un par de datos límite admitan una solución, e incluso si existe, no hay estabilidad con respecto a pequeñas perturbaciones en los datos. (De hecho, este es el problema original mal planteado en el sentido de Hadamard, y el ejemplo clásico de por qué no se pueden ignorar las condiciones límite cuando se habla de una buena postura. Puede encontrar un ejemplo explícito en sus Conferencias sobre el problema de Cauchy en diferencial lineal parcial ecuaciones de la década de 1920).
Si puede imponer condiciones de contorno (Neumann, Robin, Dirichlet, que necesitaría para fijar la constante en la integración de la derivada tangencial, por cierto), entonces es suficiente usar los componentes normales de su gradiente como condición de Neumann (si puede arreglar el modo constante) o integrar los componentes tangenciales como una condición de Dirichlet. Dado que ambas condiciones corresponden presumiblemente a la misma función, obtendrá la misma solución de cualquier manera.
fuente
biharmonic
demo. Esto probablemente no tenga el término de Laplace, pero supongo que se puede agregar fácilmente.No puede esperar que la solución a su problema alterado sea una solución al problema de Poisson porque necesita cambiar el problema de alguna manera para que esté bien planteado.
La conclusión es que no puede esperar que el PDE de segundo orden admita dos condiciones límite independientes.
derivative()
fuente
Su enfoque no puede funcionar, definitivamente debido a la implementación y probablemente debido a su formulación.
La imposición de condiciones de Dirichlet en dolfin, eventualmente establece los DOF correspondientes de su espacio de prueba a cero.
Este es un extracto del manual de fenics :
En resumen, al usar la rutina predeterminada en dolfin no puede aplicar tanto Dirichlet como otras condiciones en el mismo límite.
Sin embargo, antes de intentar solucionar esto en su implementación, busque los espacios de prueba correctos para su formulación matemática (como acaba de mencionar @Jan Blechta).
fuente