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
sumber
Jawaban:
Pertama, poin umum: Anda tidak dapat menentukan kondisi batas arbitrer untuk operator diferensial parsial dan berharap bahwa persamaan diferensial parsial (yang selalu mencakup kondisi operator dan batas) ditempatkan dengan baik, yaitu, mengakui solusi unik yang bergantung terus menerus pada data - yang semuanya merupakan syarat yang diperlukan untuk benar-benar mencoba menghitung sesuatu.
Bergantung pada operator, sering kali ada sejumlah kondisi valid yang dapat Anda terapkan (untuk mendapatkan rasa, lihat monograf tiga volume oleh Lions and Magenes). Namun, apa yang Anda coba lakukan (tentukan gradien penuh, yang setara dengan kondisi Dirichlet dan Neumann pada batas (bagian dari) yang sama untuk PDE elips orde dua) tidak termasuk di antara mereka - ini dikenal sebagai masalah lateral Cauchy, dan salah posisi: tidak ada jaminan bahwa pasangan data batas yang diberikan mengakui solusi, dan bahkan jika ada, tidak ada stabilitas sehubungan dengan gangguan kecil dalam data. (Sebenarnya, ini adalah masalah keliru yang asli dalam arti Hadamard, dan contoh klasik mengapa Anda tidak dapat mengabaikan kondisi batas saat membahas posisi yang baik. Anda dapat menemukan contoh eksplisit dalam kuliahnya tentang masalah Cauchy dalam diferensial parsial linear persamaan dari tahun 1920-an.)
Jika Anda dapat memaksakan kondisi batas (Neumann, Robin, Dirichlet - yang Anda perlukan untuk memperbaiki konstanta dalam integrasi turunan tangensial, omong-omong), maka cukup menggunakan komponen normal gradien Anda sebagai kondisi Neumann (jika Anda dapat memperbaiki mode konstan) atau mengintegrasikan komponen tangensial sebagai kondisi Dirichlet. Karena kedua kondisi tersebut mungkin berhubungan dengan fungsi yang sama, Anda juga mendapatkan solusi yang sama.
sumber
biharmonic
demo. Ini mungkin tanpa istilah Laplace tapi saya rasa itu dapat dengan mudah ditambahkan.Anda tidak dapat berharap bahwa solusi untuk masalah Anda yang diubah akan menjadi solusi untuk masalah Poisson karena Anda perlu mengubah masalah itu entah bagaimana untuk membuatnya berpose dengan baik.
Kesimpulannya adalah Anda bahwa Anda tidak dapat mengharapkan bahwa PDE urutan kedua akan mengakui dua kondisi batas independen.
derivative()
sumber
Pendekatan Anda tidak dapat bekerja, pasti karena implementasi dan mungkin karena formulasi Anda.
Memaksakan kondisi Dirichlet di dolfin, akhirnya menetapkan DOF yang sesuai dari ruang pengujian Anda menjadi nol.
Ini adalah kutipan dari fenics-manual :
Singkatnya, menggunakan rutin standar di dolfin Anda tidak dapat menerapkan Dirichlet dan kondisi lainnya pada batas yang sama.
Namun, sebelum Anda mencoba untuk memperbaiki ini dalam implementasi Anda, cari menemukan ruang tes yang tepat untuk formulasi matematika Anda (seperti @Jan Blechta baru saja disebutkan.)
sumber