具有弯曲边界的椭圆 PDE 的简单编程方法?

计算科学 pde 边界条件 椭圆pde
2021-11-29 17:31:35

我对数值 PDE 知之甚少,所以如果这个方程格式不正确,我深表歉意(我感谢任何更正)。

我目前正在学习布朗运动。一个经典的结果是我们可以使用布朗运动撞击时间来求解热方程。更具体地说,如果我们在中考虑一个具有平滑边界的漂亮域,并从域中释放布朗运动,那么可以通过平均布朗运动击中的点(根据击中概率加权)。对于更复杂的 PDE(例如生存时间和 Feymann-Kac 的东西),这个想法的更复杂的版本是可能的。Rnx

我想自己编写一个 PDE 求解器来模拟这个问题。那就是,我想通过求解相应的 PDE 来确定布朗运动的撞击时间。(这比使用 BM 运行蒙特卡洛模拟更准确,因为没有蒙特卡洛错误。)我对维度最感兴趣,尽管我希望能够走得更高。n=2,3

我想用非常弯曲的形状来做到这一点:椭圆体、球体、U、填充笑脸等。

我的理解是,最后一种方法排除了有限差分方法,或者至少使它们很难编程(由于需要一些我不太了解的外推技术)。我翻过的书似乎都集中在矩形域上。

我被推荐使用 FD 方法作为开始 PDE 求解的最简单方法。下一个最简单的方法是什么(它给出了相对较好的结果并且最容易编程)可以让我在弯曲域上解决这些问题?

3个回答

使用有限差分法当然可以解决弯曲边界的问题,但这很尴尬。

使用有限元方法更简单。在那里,您需要将域细分为一个网格,通常由 2d 中的三角形和 3d 中的四面体组成。这些不需要符合弯曲边界,您只需要三角形/四面体的顶点位于弯曲边界上 - 常用的网格生成器都这样做。然后,即使您的网格由直边三角形/四面体组成,您也可以保证有限元解收敛到 PDE 的精确解。

当然可以通过使用具有弯曲边缘和面的三角形和四面体来改进事物(并获得更好的准确性)。但这不是微不足道的。您不想自己这样做,尽管您可以使用广泛使用的有限元库之一,看看它们是否支持这种弯曲单元。(一个选择是 deal.II,它支持弯曲的单元格——既使用多项式近似,也使用您域的精确几何;我是该库的主要开发人员之一,因此请考虑我的建议中的利益冲突。)

对于您所描述的复杂领域,我认为有限元法基本上是唯一的方法。当空间域很简单但您的域很复杂时,光谱离散化很好。有限体积法适用于双曲线守恒定律,但可以说不太适合椭圆或抛物线型问题。我不会在这里尝试总结有限元或其他 Galerkin 类型的方法。相反,我只会向您推荐我最喜欢的有关该主题的书籍,一本是Braess的,另一本是Gockenbach的。

编写代码的简单程度可能会有很大差异,具体取决于您自己想做多少。我已经完全从头开始为分段线性有限元编写了网格数据结构、稀疏矩阵数据结构和组装内核。这是合理的做法,我发现它很有教育意义,但会很耗时。另一方面是使用高级软件包,如 FEniCS、Firedrake*、scikit-fem、sfepy 等。要使用这些软件包,您需要了解 PDE 的弱形式并能够使用网格发电机。它们将使您无需详细了解如何将 PDE 的弱形式转换为矩阵向量方程。使用这些包可以使开发速度非常快,但会让您感觉它是一个不透明的大盒子,您不了解里面发生了什么。deal.II 包位于中间的某个位置。您部分负责有限元矩阵组装,但该软件包提供了许多常见的元素族,已经定义了良好的网格和矩阵数据结构,将为您处理正交等。

您选择选择哪一个是您必须做出的决定。您想在这方面投入多少工作,您认为了解较低级别的细节在多大程度上很重要?

无论如何,您都需要一个网格生成器。两个最受欢迎的选择是gmshTriangle

*我为 Firedrake 做出贡献并获得资助以开发基于它的下游应用程序。

如果您可以定义一个将矩形转换为您想要使用的域的映射,那么您可以使用本文中描述的简单方法。作为可以处理的“非常弯曲”域的示例,请参见此

它专注于双曲问题,但包括如何离散抛物线或椭圆问题的描述(参见第 7.2 节)。它表面上是一种有限体积法,但二阶精确有限体积法本质上等同于有限差分法。