泊松方程:通过拉格朗日乘法器将全梯度作为边界条件


11

我具有由泊松方程在两个维度支配的物理问题 我有两个梯度分量的测量ü /Xú /ý沿边界的某些部分, Γ ,所以想强加 û

2u=f(x,y),inΩ
u/xu/yΓm 和传播到远场。
uxi0=gm,onΓm

切向梯度分量,,我可以整合,然后通过狄利克雷条件执行,使得 ∫Γùux(t,0) 为了同时施加法向分量,ù

Γmux(t,0)ds=u0
,我收集我会通过拉格朗日乘子去。ux(n,0)

所以我觉得变形式是那么 我花了很长时间尝试将有关问题的信息(例如https://answers.launchpad.net/fenics/+question/212434https//https://answers.launchpad.net/fenics/+question)拼凑起来 / 216323

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

但仍然看不到我要去哪里。到目前为止,我的解决方案尝试是:

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)

可以运行,但给出的噪声结果根本不像泊松方程的解。似乎与组合函数空间有关,但是我找不到错误。
我将不胜感激,向正确的方向提供帮助或指示-非常感谢!
干杯
马库斯


让我说对了:您拥有Dirichlet和Neumann数据,但仅在部分边界上?
克里斯蒂安·克拉森

1
据我所知,OP是边界处给出的渐变。Dirichlet数据用于施加切向导数。我认为将Dirichlet和Neumann并入边界的一部分是很奇怪的,但是在这种特殊情况下,这是一致的。因此,问题在于如何在边界(通过乘法器)应用梯度数据。
1

没错,这将提供一致的数据,但是仍然存在缺乏稳定性的问题,并且您仅在边界的一部分上具有边界条件。
克里斯蒂安·克拉森

好的,让我提供更多有关我要解决的特定物理问题的信息。我有一个静磁场,可以合理地假设它是旋转对称的,因此是2D的。我沿着一条相当接近旋转轴的线测量了磁场密度矢量的径向分量和轴向分量,并希望在远离该旋转轴的相当远的距离处看到该磁场。Dirichlet和Neumann BC的结合只是我按照Jan雄辩地描述的方法解决问题的想法-在边界处施加梯度数据。
马库斯

1
好的,那将大大改变事情。因此,您有一个无界域,并且在边界的整个 “有限”部分上都有派生信息?
克里斯蒂安·克拉森

Answers:


8

首先,要注意一点:您不能为偏微分算子规定任意的边界条件,并且不能期望偏微分方程(始终包括算子和边界条件)都具有适当的条件,即,接受一个唯一的解,该解一直依赖于数据-所有这些都是实际尝试计算某些内容的必要条件。

根据操作员的不同,通常可以施加许多有效条件(要品尝,请参阅Lions和Magenes撰写的三卷本专着)。但是,您要尝试做的事情(指定完整的梯度,这等同于二阶椭圆PDE在相同(部分)边界上的Dirichlet和Neumann条件)-称为横向柯西问题,并且是不适当的:无法保证给定的一对边界数据允许解,即使存在一个解,也无法保证数据中的微小扰动。(实际上,这是从Hadamard的角度来看的原始不适定问题,也是讨论良好适定性时不能忽略边界条件的经典示例。您可以在他的关于Cauchy问题的讲座中找到一个明确的示例:线性偏微分 1920年代的方程式。)

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

  1. 如果可以施加边界条件(Neumann,Robin,Dirichlet-顺便说一句,您需要在切线导数积分中固定常数),那么将梯度的法向分量用作Neumann条件就足够了(如果可以固定常数模式)或将切向分量作为Dirichlet条件进行积分。由于这两个条件可能对应于相同的功能,因此您可以通过任何一种方式获得相同的解决方案。

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

    H2


有关FEniCS中混合元素的实现,请参见biharmonic演示。这可能没有Laplace术语,但我想可以很容易地添加它。
1

嗨,克里斯蒂安,谢谢您的建议!就数字稳定性而言,我的印象是泊松方程是良性的-感谢您指出这一点。我会按照您的建议进行阅读。不确定这是否会带来实质性改变,但正如进一步评论中所述,Dirichlet-Neumann组合可能具有误导性。我正在寻找的“全部”是一种在边界上施加梯度数据的方法。
马库斯

2
泊松方程是良性的,但这不是您要解决的方程:)(边界条件是方程的一个组成部分;仅算子不足以决定稳定性。)
Christian Clason

好吧,这给了我一些值得咀嚼的东西。感谢大家的时间,建议和耐心,以及我对进入XY陷阱的歉意...
Markus

4

您不能指望对变更后的问题的解决方案将是对Poisson问题的解决方案,因为您需要以某种方式更改问题以使其处于适当状态

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

结论是您不能期望二阶PDE会接受两个独立的边界条件。


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

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


2ufuH1

不幸的是,我的数学尚未达到极限,我不确定Banach空间的数学含义,但是当Lagrange乘数项消失时,我很难理解为什么该方程不是Poisson方程的解。从物理的角度来看,一个解决方案(对于我描述的实际问题,我并不是说从数学意义上讲是解决方案)必须存在,据我所知
Markus,

因此,这是一个反问题,找到远场的边界条件,它与您可以施加的Dirichlet条件一起,在您测量的边界处产生观察到的法向梯度?
马库斯

3

您的方法行不通,这绝对是由于实现,可能是因为您的制定。

在dolfin中施加Dirichlet条件,最终将测试空间的相应DOF设置为零。

这是从fenics-manual摘录的:

第3.3.9章(完):将Dirichlet边界条件应用于线性系统将识别应设置为给定值的所有自由度,并对线性系统进行修改,以使其解考虑边界条件。这是通过在与Dirichlet值相对应的矩阵的行的对角线上归零并插入1并将Dirichlet值插入到右侧矢量的相应条目中来实现的。

vΓm

总之,在dolfin中使用默认例程,您不能在同一边界上同时应用Dirichlet和其他条件。

但是,在尝试在实现中解决此问题之前,请为您的数学公式找到正确的测试空间(如@Jan Blechta所述)。


我明白您的意思-我认为我的表述可能无法完全反映我所实施的内容-我的道歉。变分原理只是一个朦胧的记忆,我正试图再次摆脱它。我已经阅读了本手册的前向和后向以及一些实现Lagrange乘法器的FEniCS代码示例。我认为您提出的问题正是您要使用第二个测试函数“ d”的原因。
马库斯

我同意@JanBlechta。首先,您需要为乘数找到合适的空间,这是不平凡的。也许有关PDE约束优化的文章会提供一些有用的想法,其中使用乘数来合并副条件。在本文中,乘数用于说明时间相关的Dirichlet条件。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.