Równanie Poissona: nałóż pełny gradient jako warunek brzegowy za pomocą mnożników Lagrange'a

11

Mam problem fizyczny rządzony równaniem Poissona w dwóch wymiarach Mam pomiary dwóch składników gradientuu /x iu /y wzdłuż pewnej części granicy, Γ m , więc chciałbym narzucić u

2u=fa(x,y),janΩ
u/xu/yΓm rozmnażają się w dalekim polu.
uxja0=solm,onΓm

Styczny składnik gradientu , mogę po prostu zintegrować, a następnie wymusić przez warunek Dirichleta, taki że Γmuux(t,0) Aby jednocześnie narzucić normalny składnik,u

Γmux(t,0)res=u0
, zrozumiałem, że będę musiał przejść przez mnożniki Lagrange'a.ux(n,0)

Myślę więc, że forma wariacyjna to Spędziłem dużo czasu próbując poskładać je razem z informacjami na temat powiązanych problemów, takich jak https://answers.launchpad.net/fenics/+question/212434https://answers.launchpad.net/fenics/+question / 216323

Ωuvrex-λΓm(ux(n,0)-solm)vres=Ωfavrex

ale wciąż nie widzę, gdzie się mylę. Moja dotychczasowa próba rozwiązania to:

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)

która działa, ale daje głośny wynik, który wcale nie przypomina rozwiązania równania Poissona. Wydaje się, że ma to coś wspólnego z połączonymi przestrzeniami funkcji, ale nie mogę znaleźć błędu.
Byłbym wdzięczny za każdą pomoc lub wskazówki we właściwym kierunku - wielkie dzięki już!
Pozdrawiam
Markus

Markus
źródło
Pozwól mi to wyjaśnić: masz zarówno dane Dirichleta, jak i Neumanna, ale tylko część granicy?
Christian Clason
1
Jak zrozumiałem PO, na granicy podano gradient. Dane Dirichleta są używane do narzucenia stycznej pochodnej. Pomyślałem, że to dziwne narzucenie Dirichletowi i Neumannowi jednej części granicy, ale może w tej konkretnej sytuacji jest to spójne. Problemem jest raczej zastosowanie danych gradientu na granicy (przez mnożniki).
stycznia
To prawda, że ​​dałoby to spójne dane, ale nadal masz problem z brakiem stabilności i faktem, że masz warunki brzegowe tylko na części granicy.
Christian Clason
Ok, dam więcej informacji na temat konkretnego problemu fizycznego, który próbuję rozwiązać. Mam statyczne pole magnetyczne, które mogę rozsądnie założyć, że jest obrotowo symetryczne, a więc 2D. Mierzę składowe promieniowe i osiowe wektora gęstości pola magnetycznego wzdłuż linii, dość blisko osi obrotu i chciałbym widzieć to pole magnetyczne w znacznej odległości od tej osi obrotu. Połączenie Dirichleta i Neumanna BC było moim pomysłem na podejście do problemu, jak wymownie opisał Jan - narzucone dane gradientu na granicy.
Markus
1
OK, to znacznie zmienia rzeczy. Masz więc nieograniczoną domenę i informacje pochodne na całej „skończonej” części granicy?
Christian Clason

Odpowiedzi:

8

Po pierwsze, ogólna uwaga: nie można określić arbitralnych warunków brzegowych dla operatora różniczkowania cząstkowego i oczekiwać, że równanie różniczkowe cząstkowe (które zawsze obejmuje zarówno warunki operatora, jak i warunki brzegowe) jest dobrze postawione, tzn. Dopuszcza unikalne rozwiązanie, które zależy od dane - z których wszystkie są niezbędnym warunkiem rzeczywistej próby obliczenia czegoś.

W zależności od operatora często można nałożyć wiele ważnych warunków (aby posmakować, zobacz trzytomową monografię Lions i Magenes). Jednak to, co próbujesz zrobić (określić pełny gradient, który jest równoważny zarówno warunkom Dirichleta, jak i Neumanna na tej samej (części) granicy eliptycznej PDE drugiego rzędu), nie jest wśród nich - jest to znane jako boczny problem Cauchy'egoi jest źle postawiony: nie ma gwarancji, że dana para danych granicznych dopuszcza rozwiązanie, a nawet jeśli takie istnieje, nie ma stabilności w odniesieniu do niewielkich zaburzeń w danych. (W rzeczywistości jest to pierwotnie źle postawiony problem w sensie Hadamarda i klasyczny przykład, dlaczego nie można ignorować warunków brzegowych przy omawianiu dobrej pozycji. Można znaleźć wyraźny przykład w jego Wykładach na temat problemu Cauchy'ego w częściowej różnicy liniowej równania z lat dwudziestych.)

Przejdźmy teraz do konkretnego problemu (który może być podręcznikowym przykładem problemu XY ). Jeśli dobrze rozumiem, chcesz rozwiązać problem zewnętrzny równania Poissona i weź dwuwymiarową domenę konformacyjną . Masz pełne dane (Dirichlet - używając sztuczki stycznej pochodnej - i Neumann) na (powiedzmy) x = r . Jeśli R jest wystarczająco duży, możesz uzasadnić stan promieniowania (który określa asymptotyczne zachowanie twojego rozwiązania przy x ); patrz np. książka(r,R)×(za,b)x=rRxMetody numeryczne problemów zewnętrznych autorstwa Long'an Ying. Pytanie brzmi: co wiesz o pozostałych częściach granicznych, i y = b .y=zay=b

  1. Jeśli potrafisz narzucić warunki brzegowe (Neumann, Robin, Dirichlet - które, nawiasem mówiąc, musielibyście ustalić stałą w całkowaniu pochodnej stycznej), wystarczy użyć albo normalnych składników gradientu jako warunku Neumanna (jeśli można naprawić tryb stały) lub zintegrować komponenty styczne jako warunek Dirichleta. Ponieważ oba warunki prawdopodobnie odpowiadają tej samej funkcji, w obu przypadkach otrzymujesz to samo rozwiązanie.

  2. Jeśli nie znasz zachowania w i y = b , naprawdę masz boczny problem Cauchy'ego i nie możesz obliczyć rozwiązania przy użyciu standardowych metod elementów skończonych. Standardowym sposobem radzenia sobie z tym jest metoda quasi-odwracalności (wprowadzona przez Lattésa i Lionsa w latach 60. XX wieku; patrz ich książka ), która polega na przybliżeniu problemu drugiego rzędu przez problem czwartego rzędu (gdzie można - i trzeba - przepisać dwa warunki brzegowe). W twoim przypadku oznaczałoby to zastąpienie - Δ u = f przez - Δ u + ε Δ 2y=zay=b-Δu=fa dla niektórych małych ε > 0 . (Można to również zinterpretować jako zminimalizowanie pozostałości w odpowiedniej normie i dodanieterminu regularyzacji H 2 ; związanego z twoim komentarzem na temat traktowania problemu jako problemu odwrotnego.) Możesz to pokazać dla kompatybilnych danych (tj. Pary granic warunki, które faktycznie odpowiadają rozwiązaniu u równania Poissona), quasi-odwracalne rozwiązania u ε są zbieżne do u jako ε 0 .-Δu+εΔ2)u=faε>0H.2)uuεuε0

    H.2)

Christian Clason
źródło
Wdrożenie przez mieszane elementy w FEniCS patrz biharmonicdemo. Prawdopodobnie jest to bez terminu Laplace'a, ale myślę, że można go łatwo dodać.
Jan Blechta
Cześć Christian, dziękuję za twoją sugestię! Miałem wrażenie, że równanie Poissona jest łagodne, jeśli chodzi o stabilność numeryczną - dziękuję za zwrócenie na to uwagi. Przeczytam o tym, jak zasugerowałeś. Nie jestem pewien, czy to znacznie zmienia sytuację, ale jak wspomniano w komentarzu powyżej, kombinacja Dirichleta-Neumanna może być myląca. „Wszystko”, którego szukam, to sposób nałożenia danych gradientu na granicy.
Markus
2
Równanie Poissona jest łagodne, ale nie jest to równanie, które próbujesz rozwiązać :) (Warunki brzegowe są integralną częścią równania; sam operator nie jest wystarczający, aby zdecydować o stabilności.)
Christian Clason
Dobra, to daje mi coś do przeżuwania. Dziękuję wszystkim za poświęcony czas, radę i cierpliwość - i przepraszam za wpadnięcie w pułapkę XY ...
Markus
4

Nie możesz oczekiwać, że rozwiązanie twojego zmienionego problemu będzie rozwiązaniem problemu Poissona, ponieważ musisz jakoś zmienić problem, aby był dobrze postawiony.

fa(u,λ)=Ω12)|u|2)rex-Ωfaurex-ΓN.solureS.+ΓN.λ(u-ure)reS.
(u,λ)V.×L.2)(ΓN.)V.={vH.1;v|Γre=0}ΓreureΓN.fa(u)
0=refa(u)[v]=Ωuvrex-Ωfavrex-ΓN.solvreS.vV.,
ΓN.Γre
0=refa(u,λ)[v,μ]=Ωuvrex-Ωfavrex-ΓN.solvreS.+ΓN.λvreS.+ΓN.μ(u-ure)reS.(v,μ)V.×L.2)(ΓN.),
-Δu=faun=sol-λΓN.ΓN.

λ|sol|

ΓrevV.Γre

Wniosek jest taki, że nie można oczekiwać, że PDE drugiego rzędu zaakceptuje dwa niezależne warunki brzegowe.


fa(u,λ)refa(u,λ)[v,μ]derivative()

fa(u,λ)λL.2)(ΓN.)λL.2)(Ω)λR

Jan Blechta
źródło
2)u-fauH.1
Moja matematyka niestety nie jest do zera i nie jestem pewien co do matematycznych implikacji przestrzeni Banacha, ale staram się zrozumieć, dlaczego to równanie nie jest rozwiązaniem równania Poissona, gdy zanika termin mnożnika Lagrange'a. Z fizycznego punktu widzenia rozwiązanie (opisanego przeze mnie problemu praktycznego, nie mam na myśli rozwiązania matematycznego) musi istnieć, o ile widzę
Markus
Jest to więc raczej odwrotny problem, znalezienie warunku granicznego dla dalekiego pola, które wraz z warunkiem Dirichleta, który można narzucić, daje obserwowany gradient normalny na granicy, na której mierzysz?
Markus
3

Twoje podejście nie może działać, zdecydowanie z powodu wdrożenia i prawdopodobnie z powodu sformułowania.

Narzucając warunki Dirichleta w dolfinie, ostatecznie ustawia odpowiednie DOF twojego obszaru testowego na zero.

Oto fragment podręcznika fenics :

Rozdział 3.3.9 (koniec): Zastosowanie warunku brzegowego Dirichleta do układu liniowego określi wszystkie stopnie swobody, które należy ustawić na podaną wartość, i zmodyfikuje układ liniowy tak, aby jego rozwiązanie spełniało warunki brzegowe. Odbywa się to przez wyzerowanie i wstawienie 1 na przekątnej rzędów macierzy odpowiadających wartościom Dirichleta i wstawienie wartości Dirichleta w odpowiednim wpisie wektora po prawej stronie [...]

vΓm , co powoduje, że twój termin z mnożnikiem również zniknie.

Podsumowując, używając domyślnej procedury w dolfin, nie można zastosować zarówno Dirichleta, jak i innych warunków na tej samej granicy.

Zanim jednak spróbujesz naprawić to w swojej implementacji, znajdź odpowiednie przestrzenie testowe dla swojego sformułowania matematycznego (jak właśnie wspomniał @Jan Blechta).

Jan
źródło
Rozumiem twój punkt widzenia - myślę, że moje sformułowanie może nie odzwierciedlać dokładnie tego, co wdrożyłem - moje przeprosiny. Zasada wariacyjna jest tylko mglistym wspomnieniem i staram się znów to zrozumieć. Przeczytałem instrukcję do przodu i do tyłu wraz z kilkoma przykładami kodu FEniCS implementującego mnożniki Lagrange'a. Myślałem, że podniesiony przez ciebie problem jest właśnie powodem, dla którego użyjesz drugiej funkcji testowej „d”.
Markus
Zgadzam się z @JanBlechta. Najpierw musisz znaleźć odpowiednią przestrzeń dla mnożnika, co nie jest łatwe. Być może teksty na temat optymalizacji ograniczeń PDE, w których używa się mnożników do uwzględnienia warunków ubocznych, dostarczą pomocnych pomysłów. W tym artykule mnożnik służy do uwzględnienia zależnych od czasu warunków Dirichleta.
stycznia