Eu tenho um problema físico governado pela equação de Poisson em duas dimensões Tenho medidas dos dois componentes do gradiente ∂ u / ∂ x e ∂ u / ∂ y ao longo de alguma parte do limite, Γ m , então gostaria de impor ∂ u
O componente do gradiente tangencial, , que pode apenas integrar e, em seguida, aplicar por meio de uma condição de Dirichlet, de tal modo que ∫ym∂u Para impor simultaneamente o componente normal, ∂ u
Então eu acho que a forma variacional é então Passei muito tempo tentando juntar as informações sobre problemas relacionados, como https://answers.launchpad.net/fenics/+question/212434https://answers.launchpad.net/fenics/+question / 216323
mas ainda não consigo ver onde estou errado. Minha tentativa de solução até agora é:
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 é executado, mas fornece um resultado barulhento que não se parece com uma solução para uma equação de Poisson. Parece ter algo a ver com os espaços funcionais combinados, mas não consigo encontrar o erro.
Gostaria muito de receber ajuda ou sugestões na direção certa - muito obrigado já!
Cheers
Markus
fonte
Respostas:
Primeiro, um ponto geral: você não pode prescrever condições de contorno arbitrárias para um operador diferencial parcial e esperar que a equação diferencial parcial (que sempre inclui condições de operador e de contorno) seja bem colocada, ou seja, admita uma solução única que depende continuamente da dados - tudo isso é uma condição necessária para realmente tentar calcular algo.
Dependendo do operador, muitas vezes há várias condições válidas que você pode impor (para provar, veja a monografia de três volumes de Lions e Magenes). No entanto, o que você está tentando fazer (especifique o gradiente completo, equivalente às condições de Dirichlet e Neumann no mesmo limite (parte do)) para um PDE elíptico de segunda ordem) não está entre eles - isso é conhecido como problema lateral de Cauchye está incorreto: não há garantia de que um determinado par de dados de fronteira admita uma solução e, mesmo que exista, não há estabilidade com relação a pequenas perturbações nos dados. (De fato, esse é o problema mal colocado original, no sentido de Hadamard, e o exemplo clássico de por que você não pode ignorar as condições de contorno ao discutir a boa postura. Você pode encontrar um exemplo explícito nas suas Palestras sobre o problema de Cauchy, no diferencial parcial linear. equações da década de 1920).
Se você pode impor condições de contorno (Neumann, Robin, Dirichlet - que você precisaria fixar a constante na integração da derivada tangencial, a propósito), então é suficiente usar os componentes normais do seu gradiente como condição Neumann (se você pode corrigir o modo constante) ou integrar os componentes tangenciais como uma condição Dirichlet. Como as duas condições presumivelmente correspondem à mesma função, você obtém a mesma solução de qualquer maneira.
fonte
biharmonic
demo. Provavelmente isso não tem o termo Laplace, mas acho que pode ser facilmente adicionado.Você não pode esperar que a solução para o seu problema alterado seja uma solução para o problema de Poisson, porque você precisa alterar o problema de alguma forma para torná-lo bem posicionado.
Conclusão: você não pode esperar que o PDE de segunda ordem admita duas condições de contorno independentes.
derivative()
fonte
Sua abordagem não pode funcionar, definitivamente por causa da implementação e provavelmente por causa de sua formulação.
A imposição de condições de Dirichlet no dolfin, eventualmente define os DOFs correspondentes do seu espaço de teste como zero.
Este é um trecho do manual fenics :
Em resumo, usando a rotina padrão no dolfin, você não pode aplicar Dirichlet e outras condições no mesmo limite.
No entanto, antes de tentar corrigir isso em sua implementação, encontre os espaços de teste certos para sua formulação matemática (como @Jan Blechta acabou de mencionar).
fonte