2个版本
0.1.1 | 2024年4月4日 |
---|---|
0.1.0 | 2024年4月4日 |
#1986 在 算法
2MB
30K SLoC
欢迎来到mesh-sweeper!
本readme将简要介绍网格清扫是什么以及它的潜在应用。对线性代数的基本理解在这里很有用!
什么是网格清扫?
使用网格清扫求解线性系统
本质上我们想要解决一个线性系统;即找到$x\in\mathbb{R}^n$,使得$Ax=b$,给定我们知道$A\in\mathbb{R}^{n\times n}$和$b\in\mathbb{R}^n$。有很多方法可以解决这个,包括使用高斯消元法等精确解或使用Krylov方法等近似解。这两种方法都有很多优点,其中精确解通常具有更高的计算复杂度要求。例如,高斯消元法需要$\mathcal{O}(n^3)$操作,而Krylov方法可以在特定的矩阵结构下达到$\mathcal{O}(n)$操作。网格清扫是高斯消元法的一种变体,称为前向替换。这种方法依赖于矩阵$A$是下三角形的,但将计算复杂度降低到$\mathcal{O}(n^2)$。
排序线性方程 + 转运
然而,网格清扫的难点不在于矩阵求解器,而在于形成矩阵$A$的线性方程的排序。通常,当您将数值方法应用于偏微分方程(PDE)时,您最终会得到一个需要解决的方程组。在许多情况下,这个方程组依赖于某些空间-时间分解。例如,如果您考虑在空间-时间域$\Omega\times[0, T]\subset\mathbb{R}\times\mathbb{R}$上的传输,那么您可以分解$\Omega$和$[0, T]$为区间(可能是均匀的)并在每个空间区域内模拟建模量的时间变化。我们可以为这种量的变化生成一个近似的线性方程,因此可以将每个空间区域的所有此类方程组合起来形成$A$。正如之前提到的,这就是发生魔法的地方,我们如何确定放置这些方程的顺序?
我们可以通过利用偏微分方程的结构来实现这一点。在传输设置中的每个区域,在其两个边界上都有流入和流出。在时间分解的每个时刻,边界上的流动要么是进入区域,要么是离开区域。这是我们可以利用来生成算法的东西。如果整个时空域的传输方向是固定的,那么流动要么是向左,要么是向右 - 区域之间存在自然排序。这使我们可以说每个区域仅取决于其上游邻居。从线性方程的角度来看,我们断言一个区域建模的数量的变化等于已经存在的数量加上从上游邻居流入的数量减去流向下游邻居的数量。如果下游流量与当前数量成比例,那么结果是具有对角线和次对角线条目的矩阵 $A$。这是一个下三角矩阵,我们可以进行扫描。
局限性 + 当前最佳实践
这里的缺点是我们的例子有些人为。在一维空间中,这是给定设置的一个平凡结果。在二维或多维空间中,这是一个困难的问题。例如,在二维中,如果一个区域是非凸的(可能是C形),那么流量将离开这个区域,并在稍后重新进入。这会在网格中产生一个循环,使得我们的矩阵 $A$ 永远不能是下三角的。有一些具有良好结构的网格可以使用,如用于规则立方体网格的KBA算法来防止这种情况,但对于一般的多边形/多胞体网格,这要困难一些。当前最佳算法是“上游数量”算法,但我们还提出了一种针对新类别的结构化但又不规则的网格的新型算法。