Mam problem fizyczny rządzony równaniem Poissona w dwóch wymiarach Mam pomiary dwóch składników gradientu ∂ u / ∂ x i ∂ u / ∂ y wzdłuż pewnej części granicy, Γ m , więc chciałbym narzucić ∂ u
Styczny składnik gradientu , mogę po prostu zintegrować, a następnie wymusić przez warunek Dirichleta, taki że ∫Γm∂u Aby jednocześnie narzucić normalny składnik, ∂ u
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
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
źródło
Odpowiedzi:
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 ) × ( a , b ) x = r R x → ∞ Metody numeryczne problemów zewnętrznych
autorstwa Long'an Ying. Pytanie brzmi: co wiesz o pozostałych częściach granicznych, i y = b .y= a y= b
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.
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= a y= b - Δ u = f 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 = f ε > 0 H.2) u uε u ε → 0
źródło
biharmonic
demo. Prawdopodobnie jest to bez terminu Laplace'a, ale myślę, że można go łatwo dodać.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.
Wniosek jest taki, że nie można oczekiwać, że PDE drugiego rzędu zaakceptuje dwa niezależne warunki brzegowe.
derivative()
źródło
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 :
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).
źródło