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