Ich habe ein physikalisches Problem, das durch die Poisson-Gleichung in zwei Dimensionen bestimmt wird Ich habe Messungen der beiden Gradientenkomponenten ∂ u / ∂ x und ∂ u / ∂ y entlang eines Teils der Grenze Γ m , möchte also ∂ u auferlegen
Die tangentiale Gradientenkomponente kann ich einfach integrieren und dann durch eine Dirichlet-Bedingung erzwingen, so dass ∫Γm∂u Um gleichzeitig die Normalkomponente aufzuerlegen, ∂ u
Also ich denke , das Variationsform dann ist Ich habe lange versucht, es aus den Informationen zu verwandten Problemen wie https://answers.launchpad.net/fenics/+question/212434https://answers.launchpad.net/fenics/+question zusammenzusetzen / 216323
kann aber immer noch nicht sehen, wo ich falsch liege. Mein bisheriger Lösungsversuch ist:
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)
Dies läuft, liefert aber ein verrauschtes Ergebnis, das überhaupt keiner Lösung für eine Poisson-Gleichung ähnelt. Es scheint etwas mit den kombinierten Funktionsräumen zu tun zu haben, aber ich kann den Fehler nicht finden.
Ich würde mich über Hilfe oder Hinweise in die richtige Richtung freuen - vielen Dank bereits!
Prost
Markus
quelle
Antworten:
Zunächst ein allgemeiner Punkt: Sie können für einen partiellen Differentialoperator keine willkürlichen Randbedingungen vorschreiben und erwarten, dass die partielle Differentialgleichung (die immer sowohl Operator- als auch Randbedingungen enthält) gut aufgestellt ist, dh eine eindeutige Lösung zulässt, die kontinuierlich von der abhängt Daten - all dies ist eine notwendige Voraussetzung, um tatsächlich zu versuchen, etwas zu berechnen.
Je nach Betreiber gibt es häufig eine Reihe gültiger Bedingungen, die Sie auferlegen können (um einen Vorgeschmack zu erhalten, lesen Sie die dreibändige Monographie von Lions und Magenes). Was Sie jedoch versuchen (geben Sie den vollständigen Gradienten an, der sowohl Dirichlet- als auch Neumann-Bedingungen an derselben (Teil der) Grenze für eine elliptische PDE zweiter Ordnung entspricht), gehört nicht dazu - dies wird als a bezeichnet seitliches Cauchy-Problemund ist schlecht gestellt: Es gibt keine Garantie dafür, dass ein bestimmtes Paar von Grenzdaten eine Lösung zulässt, und selbst wenn eine existiert, gibt es keine Stabilität in Bezug auf kleine Störungen in den Daten. (Tatsächlich ist dies das ursprüngliche schlecht gestellte Problem im Sinne von Hadamard und das klassische Beispiel, warum Sie Randbedingungen bei der Erörterung von Gutstellung nicht ignorieren können. Ein explizites Beispiel finden Sie in seinen Vorlesungen über Cauchys Problem im linearen partiellen Differential Gleichungen aus den 1920er Jahren.)
Wenn Sie Randbedingungen auferlegen können (Neumann, Robin, Dirichlet - die Sie übrigens benötigen würden, um die Konstante bei der Integration der Tangentialableitung festzulegen), reicht es aus, entweder die normalen Komponenten Ihres Gradienten als Neumann-Bedingung zu verwenden (wenn Sie den konstanten Modus festlegen können) oder integrieren Sie die tangentialen Komponenten als Dirichlet-Bedingung. Da beide Bedingungen vermutlich der gleichen Funktion entsprechen, erhalten Sie in beiden Fällen die gleiche Lösung.
quelle
biharmonic
Demo. Dies ist wahrscheinlich ohne Laplace-Begriff, aber ich denke, es kann leicht hinzugefügt werden.Sie können nicht erwarten, dass diese Lösung für Ihr geändertes Problem eine Lösung für das Poisson-Problem ist, da Sie das Problem irgendwie ändern müssen, um es gut zu stellen.
Man könnte vermuten, dass eine mögliche Problemformulierung darin besteht, zu minimieren
Die Schlussfolgerung ist, dass Sie nicht erwarten können, dass PDE zweiter Ordnung zwei unabhängige Randbedingungen zulässt.
derivative()
quelle
Ihr Ansatz kann nicht funktionieren, definitiv aufgrund der Implementierung und wahrscheinlich aufgrund Ihrer Formulierung.
Wenn Sie Dirichlet-Bedingungen in Dolfin auferlegen, werden die entsprechenden DOFs Ihres Testraums schließlich auf Null gesetzt.
Dies ist ein Auszug aus dem Fenics-Handbuch :
Zusammenfassend lässt sich sagen, dass Sie mit der Standardroutine in Dolfin nicht sowohl Dirichlet- als auch andere Bedingungen an derselben Grenze anwenden können.
Bevor Sie jedoch versuchen, dies in Ihrer Implementierung zu beheben, suchen Sie die richtigen Testbereiche für Ihre mathematische Formulierung (wie @Jan Blechta gerade erwähnt hat).
quelle