Tôi có một vấn đề vật lý chi phối bởi phương trình Poisson theo hai chiều Tôi có đo của hai thành phần Gradient ∂ u / ∂ x và ∂ u / ∂ y cùng một số phần của ranh giới, Γ m , vì vậy muốn áp đặt ∂ u
Thành phần gradient tiếp tuyến, , tôi chỉ có thể tích hợp và sau đó thực thi thông qua một điều kiện Dirichlet, chẳng hạn rằng ∫gammam∂u Để áp đặt đồng thời thành phần bình thường, ∂ u
Vì vậy, tôi nghĩ rằng hình thức biến phân là sau đó Tôi đã mất một thời gian dài để cố gắng ghép nó lại với nhau từ thông tin về các vấn đề liên quan như https://answers.launchpad.net/fenics/+question/212434https://answers.launchpad.net/fenics/+question / 216323
nhưng vẫn không thể thấy tôi đang đi sai ở đâu Cố gắng giải pháp của tôi cho đến nay là:
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)
mà chạy nhưng cho một kết quả ồn ào hoàn toàn không giống như một giải pháp cho phương trình Poisson. Nó dường như có một cái gì đó để làm với các không gian chức năng kết hợp, nhưng tôi không thể tìm thấy sai lầm.
Tôi sẽ đánh giá cao bất kỳ trợ giúp hoặc con trỏ đi đúng hướng - cảm ơn rất nhiều!
Chúc mừng
Markus