Saya memiliki masalah fisik yang diatur oleh persamaan Poisson dalam dua dimensi Saya memiliki pengukuran dua komponen gradien ∂ u / ∂ x dan ∂ u / ∂ y sepanjang beberapa bagian batas, Γ m , jadi ingin memaksakan ∂ u
Komponen gradien tangensial, , saya hanya bisa mengintegrasikan dan kemudian menegakkan melalui kondisi Dirichlet, sehingga ∫Γm∂u Untuk memaksakan komponen normal secara bersamaan, ∂ u
Jadi saya pikir bentuk variasinya kemudian Saya menghabiskan waktu lama untuk mencoba menyatukannya dari informasi tentang masalah terkait seperti https://answers.launchpad.net/fenics/+question/212434https://answers.launchpad.net/fenics/+question / 216323
tetapi masih tidak bisa melihat di mana saya salah. Upaya solusi saya sejauh ini adalah:
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)
yang berjalan tetapi memberikan hasil yang bising sama sekali tidak menyerupai solusi untuk persamaan Poisson. Tampaknya ada hubungannya dengan ruang fungsi gabungan, tetapi saya tidak dapat menemukan kesalahan.
Saya akan menghargai bantuan atau petunjuk ke arah yang benar - sudah banyak terima kasih!
Cheers
Markus