Phương trình Poisson: Đặt độ dốc đầy đủ làm điều kiện biên thông qua hệ số nhân Lagrange


11

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 Gradientu /xu /y cùng một số phần của ranh giới, Γ m , vì vậy muốn áp đặt u

2u=f(x,y),inΩ
u/xu/yΓm và truyền vào trường xa.
uxi0=gm,onΓm

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 gammamuux(t,0) Để áp đặt đồng thời thành phần bình thường,u

Γmux(t,0)ds=u0
, tôi tập hợp tôi sẽ phải đi qua hệ số nhân Lagrange.ux(n,0)

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

ΩuvdxλΓm(ux(n,0)gm)vds=Ωfvdx

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


Hãy để tôi nói điều này đúng: Bạn có cả dữ liệu Dirichlet và Neumann, nhưng chỉ trên một phần của ranh giới?
Christian Clason

1
Như tôi đã hiểu về OP, đó là độ dốc được đưa ra ở ranh giới. Dữ liệu Dirichlet được sử dụng để áp đặt đạo hàm tiếp tuyến. Tôi nghĩ thật kỳ quặc khi áp đặt cả Dirichlet và Neumann vào một phần của ranh giới nhưng có lẽ trong tình huống cụ thể này, nó là nhất quán. Vì vậy, vấn đề là làm thế nào để áp dụng dữ liệu độ dốc ở ranh giới (thông qua hệ số nhân).
Ngày

Đúng, điều đó sẽ cung cấp dữ liệu nhất quán, nhưng bạn vẫn gặp vấn đề thiếu ổn định và thực tế là bạn có các điều kiện biên chỉ trên một phần của ranh giới.
Christian Clason

Ok, hãy để tôi cung cấp thêm một số thông tin về vấn đề vật lý cụ thể mà tôi đang cố gắng giải quyết. Tôi có một từ trường tĩnh mà tôi có thể cho là hợp lý xoay đối xứng, do đó là 2D. Tôi đo các thành phần hướng tâm và hướng trục của vectơ mật độ từ trường dọc theo một đường thẳng, khá gần với trục quay và muốn thấy từ trường này ở khoảng cách đáng kể so với trục quay này. Sự kết hợp giữa Dirichlet và Neumann BC chỉ là ý tưởng của tôi về cách tiếp cận vấn đề như Jan đã mô tả một cách hùng hồn - áp đặt dữ liệu độ dốc ở ranh giới.
Markus

1
OK, điều đó thay đổi đáng kể. Vì vậy, bạn có một miền không giới hạn và thông tin phái sinh trên toàn bộ phần "hữu hạn" của ranh giới?
Christian Clason

Câu trả lời:


8

Đầu tiên, một điểm chung: bạn không thể quy định các điều kiện biên tùy ý cho toán tử vi phân một phần và mong đợi rằng phương trình vi phân từng phần (luôn bao gồm cả hai điều kiện biên và điều kiện biên) được đặt ra, tức là, thừa nhận một giải pháp duy nhất phụ thuộc liên tục vào dữ liệu - tất cả đều là điều kiện cần thiết để thực sự cố gắng tính toán một cái gì đó.

Tùy thuộc vào nhà điều hành, thường có khá nhiều điều kiện hợp lệ bạn có thể áp đặt (để có được hương vị, hãy xem chuyên khảo ba tập của Lions và Magenes). Tuy nhiên, những gì bạn đang cố gắng thực hiện (chỉ định gradient đầy đủ, tương đương với cả hai điều kiện Dirichlet và Neumann trên cùng một ranh giới (một phần của) cho PDE hình elip bậc hai) không nằm trong số đó - điều này được gọi là một vấn đề Cauchy bênvà không được đặt ra: không có gì đảm bảo rằng một cặp dữ liệu ranh giới nhất định thừa nhận một giải pháp và ngay cả khi có tồn tại, không có sự ổn định nào đối với các nhiễu loạn nhỏ trong dữ liệu. (Trong thực tế, đây là bản gốc ill-đặt ra vấn đề theo nghĩa của Hadamard, và ví dụ cổ điển khiến bạn không thể bỏ qua điều kiện biên khi thảo luận nổi posedness. Bạn có thể tìm thấy một ví dụ rõ ràng trong mình bài giảng về vấn đề Cauchy trong phân từng phần tuyến tính phương trình từ những năm 1920.)

(r,R)×(a,b)x=rRxy=ay=b

  1. Nếu bạn có thể áp đặt các điều kiện biên (Neumann, Robin, Dirichlet - mà bạn sẽ cần sửa hằng số trong tích hợp đạo hàm tiếp tuyến, thì cũng đủ để sử dụng các thành phần thông thường của gradient như điều kiện Neumann (nếu bạn có thể sửa chế độ không đổi) hoặc tích hợp các thành phần tiếp tuyến làm điều kiện Dirichlet. Vì cả hai điều kiện có lẽ tương ứng với cùng một chức năng, bạn có thể có cùng một giải pháp.

  2. y=ay=bΔu=fΔu+εΔ2u=fε>0H2uuεuε0

    H2


Để thực hiện bởi các yếu tố hỗn hợp trong FEniCS, xem biharmonicbản demo. Điều này có lẽ không có thuật ngữ Laplace nhưng tôi đoán nó có thể dễ dàng thêm vào.
Jan Blechta

Xin chào Christian, cảm ơn lời đề nghị của bạn! Tôi đã có ấn tượng rằng phương trình Poisson là lành tính khi có liên quan đến sự ổn định số - cảm ơn vì đã chỉ ra điều đó. Tôi sẽ đọc nó như bạn đề nghị. Không chắc chắn nếu điều này thay đổi đáng kể, nhưng như được đề cập trong bình luận thêm, sự kết hợp Dirichlet-Neumann có lẽ là sai lệch. 'Tất cả' tôi đang tìm kiếm, là một cách áp đặt dữ liệu độ dốc ở ranh giới.
Markus

2
Phương trình Poisson là lành tính, nhưng đó không phải là phương trình mà bạn đang cố gắng giải quyết :) (Điều kiện biên là một phần không thể thiếu của phương trình; chỉ riêng người vận hành không đủ để quyết định sự ổn định.)
Christian Clason

Được rồi, điều đó cho tôi một cái gì đó để nhai. Cảm ơn mọi người vì đã dành thời gian, lời khuyên và sự kiên nhẫn của bạn - và lời xin lỗi của tôi vì đã rơi vào bẫy XY ...
Markus

4

Bạn không thể mong đợi giải pháp cho vấn đề đã thay đổi của mình sẽ là giải pháp cho vấn đề Poisson vì bạn cần thay đổi vấn đề bằng cách nào đó để làm cho nó được đặt ra.

F(u,λ)=Ω12|u|2dxΩfudxΓNgudS+ΓNλ(uuD)dS
(u,λ)V×L2(ΓN)V={vH1;v|ΓD=0}ΓDuDΓNF(u)
0=DF(u)[v]=ΩuvdxΩfvdxΓNgvdSvV,
ΓNΓD
0=DF(u,λ)[v,μ]=ΩuvdxΩfvdxΓNgvdS+ΓNλvdS+ΓNμ(uuD)dS(v,μ)V×L2(ΓN),
Δu=fun=gλΓNΓN

λ|g|

ΓDvVΓD

Kết luận là bạn không thể ngờ rằng PDE bậc hai sẽ thừa nhận hai điều kiện biên độc lập.


F(u,λ)DF(u,λ)[v,μ]derivative()

F(u,λ)λL2(ΓN)λL2(Ω)λR


2ufuH1

Toán học của tôi không thành công một cách đáng tiếc và tôi không chắc về ý nghĩa toán học của không gian Banach, nhưng tôi đấu tranh để xem tại sao phương trình không phải là một giải pháp cho phương trình Poisson khi thuật ngữ nhân Lagrange biến mất. Từ quan điểm vật lý, một giải pháp (cho vấn đề thực tế mà tôi đã mô tả, tôi không có nghĩa là giải pháp theo nghĩa toán học) phải tồn tại xa như tôi có thể thấy
Markus

Vì vậy, nó là một vấn đề nghịch đảo, tìm điều kiện biên cho trường xa, cùng với điều kiện Dirichlet mà bạn có thể áp đặt, mang lại độ dốc bình thường quan sát được ở ranh giới mà bạn đo được?
Markus

3

Cách tiếp cận của bạn không thể làm việc, chắc chắn là do việc thực hiện và có thể là do công thức của bạn.

Áp đặt các điều kiện Dirichlet trong dolfin, cuối cùng đặt DOF tương ứng của không gian thử nghiệm của bạn thành 0.

Đây là một đoạn trích từ hướng dẫn fenics :

Chương 3.3.9 (kết thúc): Việc áp dụng điều kiện biên Dirichlet cho hệ thống tuyến tính sẽ xác định tất cả các bậc tự do nên được đặt thành giá trị đã cho và sửa đổi hệ thống tuyến tính sao cho giải pháp của nó tuân thủ điều kiện biên. Điều này được thực hiện bằng cách zeroing và chèn 1 trên đường chéo của các hàng của ma trận tương ứng với các giá trị Dirichlet và chèn giá trị Dirichlet vào mục nhập tương ứng của vectơ bên phải [...]

vΓm

Tóm lại, sử dụng thói quen mặc định trong dolfin, bạn không thể áp dụng cả Dirichlet và các điều kiện khác trên cùng một ranh giới.

Tuy nhiên, trước khi bạn cố gắng khắc phục điều này trong quá trình triển khai, hãy tìm các không gian kiểm tra phù hợp cho công thức toán học của bạn (như @Jan Blechta vừa đề cập.)


Tôi thấy quan điểm của bạn - Tôi nghĩ rằng công thức của tôi có thể không phản ánh chính xác những gì tôi đã thực hiện - lời xin lỗi của tôi. Nguyên tắc đa dạng là nhưng một ký ức mơ hồ và tôi đang cố gắng quay đầu lại. Tôi đã đọc hướng dẫn tiến và lùi cùng với một số ví dụ về mã FEniCS triển khai hệ số nhân Lagrange. Tôi nghĩ rằng vấn đề bạn nêu chính xác là lý do tại sao bạn sẽ sử dụng chức năng kiểm tra thứ hai 'd'.
Markus

Tôi đồng ý với @JanBlechta. Đầu tiên, bạn cần tìm không gian phù hợp cho hệ số nhân, không cần thiết. Có thể các văn bản về tối ưu hóa ràng buộc PDE, trong đó một người sử dụng bội số để kết hợp các điều kiện bên, sẽ đưa ra một số ý tưởng hữu ích. Trong bài báo này , một số nhân được sử dụng để tính các điều kiện Dirichlet phụ thuộc vào thời gian.
Ngày
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.