ฉันมีปัญหาทางกายภาพที่ควบคุมโดยสมการปัวซองในสองมิติ ฉันมีการวัดองค์ประกอบการไล่ระดับสีทั้งสองและตามส่วนของขอบเขตดังนั้นต้องการกำหนด และแพร่กระจายไปยังทุ่งไกล∂ u / ∂ x ∂ u / ∂ y Γ m ∂ u
องค์ประกอบการไล่ระดับสีแทนเจนต์ , ฉันสามารถรวมเข้าด้วยกันแล้วบังคับใช้ผ่านเงื่อนไข Dirichlet เพื่อกำหนดองค์ประกอบปกติพร้อมกัน , ฉันรวบรวมฉันจะต้องผ่านตัวคูณลากรองจ์∫แกมมาเมตร∂ยู∂ u
ดังนั้นฉันคิดว่ารูปแบบความแปรปรวนคือ ฉันใช้เวลานานในการพยายามรวมเข้าด้วยกันจากข้อมูลเกี่ยวกับปัญหาที่เกี่ยวข้องเช่น https: //answers.launchpad.net/fenics/+question/212434 https://answers.launchpad.net/fenics/+question/216323
แต่ก็ยังมองไม่เห็นว่าฉันกำลังทำผิดอยู่ที่ไหน ความพยายามแก้ไขของฉันจนถึงขณะนี้คือ:
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)
ซึ่งทำงาน แต่ให้ผลลัพธ์ที่มีเสียงดังไม่ได้เลยคล้ายกับวิธีการแก้สมการปัวซอง ดูเหมือนว่าจะมีบางอย่างเกี่ยวกับการรวมฟังก์ชั่นช่องว่าง แต่ฉันไม่สามารถหาข้อผิดพลาด
ฉันขอขอบคุณความช่วยเหลือหรือตัวชี้ไปในทิศทางที่ถูกต้อง - ขอบคุณมากแล้ว!
ไชโย
มาร์คัส