Equação de Poisson: impor gradiente completo como condição de contorno via multiplicadores de Lagrange


11

Eu tenho um problema físico governado pela equação de Poisson em duas dimensões Tenho medidas dos dois componentes do gradienteu /x eu /y ao longo de alguma parte do limite, Γ m , então gostaria de impor u

2u=f(x,y),inΩ
u/xu/yΓm e propagar no campo distante.
uxi0=gm,onΓm

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 ymuux(t,0) Para impor simultaneamente o componente normal,u

Γmux(t,0)ds=u0
, juntei eu teria que ir via multiplicadores de Lagrange.ux(n,0)

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

ΩuvdxλΓm(ux(n,0)gm)vds=Ωfvdx

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


Deixe-me entender isso direito: você tem os dados de Dirichlet e Neumann, mas apenas em parte da fronteira?
Christian Clason

1
Como eu entendi o OP, é o gradiente que é dado na fronteira. Os dados de Dirichlet são usados ​​para impor a derivada tangencial. Achei estranho impor Dirichlet e Neumann em uma parte da fronteira, mas talvez nessa situação em particular seja consistente. Portanto, o problema é como aplicar dados de gradiente no limite (via multiplicadores).
Jan

É verdade que isso forneceria dados consistentes, mas você ainda tem o problema da falta de estabilidade e o fato de ter condições de limite em apenas parte do limite.
Christian Clason

Ok, deixe-me dar mais algumas informações sobre o problema físico específico que estou tentando resolver. Eu tenho um campo magnético estático que posso razoavelmente assumir que é simétrico rotacionalmente, portanto 2D. Eu medo componentes radiais e axiais do vetor de densidade do campo magnético ao longo de uma linha, bem perto do eixo de rotação e gostaria de ver esse campo magnético a uma distância substancial desse eixo de rotação. A combinação de Dirichlet e Neumann BC foi apenas a minha idéia de abordar o problema, como Jan eloquentemente descreveu - impôs dados de gradiente na fronteira.
Markus 16/05

1
OK, isso muda as coisas significativamente. Então você tem um domínio ilimitado e informações derivadas sobre toda a parte "finita" do limite?
Christian Clason

Respostas:


8

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).

(r,R)×(a,b)x=rRxy=ay=b

  1. 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.

  2. y=ay=bΔu=fΔu+εΔ2u=fε>0H2uuεuε0

    H2


Para implementação por elementos mistos no FEniCS, veja biharmonicdemo. Provavelmente isso não tem o termo Laplace, mas acho que pode ser facilmente adicionado.
Jan Blechta

Olá Christian, obrigado pela sua sugestão! Fiquei com a impressão de que a equação de Poisson era benigna no que diz respeito à estabilidade numérica - obrigado por apontar isso. Vou ler como você sugeriu. Não tenho certeza se isso muda substancialmente as coisas, mas, como mencionado no comentário adiante, a combinação Dirichlet-Neumann talvez seja enganosa. 'Tudo' o que estou procurando é uma maneira de impor dados de gradiente no limite.
Markus

2
A equação de Poisson é benigna, mas essa não é a equação que você está tentando resolver :) (As condições de contorno são parte integrante da equação; o operador por si só é insuficiente para decidir a estabilidade.)
Christian Clason

Tudo bem, isso me dá algo para mastigar. Obrigado a todos por seu tempo, conselhos e paciência - e as minhas desculpas por cair na armadilha XY ...
Markus

4

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.

F(u,λ)=Ω12|u|2dxΩfudxΓNgudS+ΓNλ(uuD)dS
(u,λ)V×L2(ΓN)V={vH1;v|ΓD=0}ΓDuDΓNF(u)
0=DF(u)[v]=ΩuvdxΩfvdxΓNgvdSvV,
ΓNΓD
0=DF(u,λ)[v,μ]=ΩuvdxΩfvdxΓNgvdS+ΓNλvdS+ΓNμ(uuD)dS(v,μ)V×L2(ΓN),
Δu=fun=gλΓNΓN

λ|g|

ΓDvVΓD

Conclusão: você não pode esperar que o PDE de segunda ordem admita duas condições de contorno independentes.


F(u,λ)DF(u,λ)[v,μ]derivative()

F(u,λ)λL2(ΓN)λL2(Ω)λR


2ufuH1

Infelizmente, minha matemática não é boa e não tenho certeza das implicações matemáticas dos espaços de Banach, mas luto para ver por que a equação não é uma solução para uma equação de Poisson quando o termo multiplicador de Lagrange desaparece. De um ponto de vista físico, uma solução (para o problema prático que eu descrevi, eu faço solução não média no sentido matemático) deve existir tanto quanto eu posso ver
Markus

Portanto, é um problema inverso, encontrar a condição de limite para o campo distante que, juntamente com a condição de Dirichlet que você pode impor, produz o gradiente normal observado no limite em que você mede?
Markus15

3

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 :

Capítulo 3.3.9 (final): A aplicação de uma condição de contorno de Dirichlet a um sistema linear identificará todos os graus de liberdade que devem ser definidos para o valor especificado e modificará o sistema linear de modo que sua solução respeite a condição de contorno. Isso é realizado zerando e inserindo 1 na diagonal das linhas da matriz correspondentes aos valores de Dirichlet e inserindo o valor de Dirichlet na entrada correspondente do vetor do lado direito [...]

vΓm

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).


Entendo o seu ponto - acho que minha formulação pode não refletir exatamente o que implementei - minhas desculpas. O princípio variacional é apenas uma lembrança nebulosa e estou tentando entender isso de novo. Eu li o manual para frente e para trás, juntamente com alguns exemplos de código FEniCS implementando multiplicadores Lagrange. Eu pensei que o problema que você levantou é exatamente o motivo pelo qual você usaria uma segunda função de teste 'd'.
Markus

Eu concordo com @JanBlechta. Primeiro, você precisa encontrar o espaço certo para o multiplicador, o que não é trivial. Talvez textos sobre otimização de restrições PDE, onde se usa multiplicadores para incorporar condições secundárias, dêem algumas idéias úteis. Neste artigo , um multiplicador é usado para explicar as condições de Dirichlet dependentes do tempo.
Jan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.