假设我分解了一个连续函数在某个领域使用具有局部基础的已知有限元方法. 认为分为“元素”。如果我想知道功能在某一点(在哪里不是节点值)那么我需要首先知道哪个元素在里面。然后我可以在元素节点之间进行插值并找到值. 我可以为所有人做到这一点在并取回我的连续函数。
为此,可以搜索每个元素以找到位置谎言。这在简单的情况下很好,但是当有 1000 个元素并且我们在 3D 中工作时,更复杂的情况呢?有没有我缺少的有效算法可以计算这个?
假设我分解了一个连续函数在某个领域使用具有局部基础的已知有限元方法. 认为分为“元素”。如果我想知道功能在某一点(在哪里不是节点值)那么我需要首先知道哪个元素在里面。然后我可以在元素节点之间进行插值并找到值. 我可以为所有人做到这一点在并取回我的连续函数。
为此,可以搜索每个元素以找到位置谎言。这在简单的情况下很好,但是当有 1000 个元素并且我们在 3D 中工作时,更复杂的情况呢?有没有我缺少的有效算法可以计算这个?
不要这样做。
在一般网格上,找到任意点需要操作在哪里是细胞的数量。你可以用更少的钱侥幸逃脱,比如说,如果您有一个网格是通过网格细化从粗网格分层构建的,但除非您使用完全结构化的网格,否则在网格内找到任意点只是一项非常昂贵的操作。
其次,一旦你有了细胞其中谎言,你需要找到位置在参考单元格上对应于. 为此,您必须反转映射,并且这(通常)需要非线性迭代——这也很昂贵。
因此,大多数算法都试图不惜一切代价避免这种情况。例如,当您进行函数积分时,您会遍历所有单元格,并在每个单元格上遍历正交点(在参考单元格上定义,因此只需要向前映射))。这是一种更快的方法,它遍历在真实空间中定义的一堆正交点(而不是相对于每个单元格的参考空间)。
最终,关键是您需要重新考虑做事的整体方法,以便您始终从所有单元格的循环开始,如果可能的话。
您可以使用域分解方法;递归地将域划分为粗略的子域并搜索每个子域(如一维中的二叉树搜索)。
如果您对此有更多了解,您可能可以提高效率。例如,如果点不会改变,查找信息可以在设置阶段预先计算和存储。如果它随时间变化但取决于解决方案的属性,通常可以通过转换为参考元素并并行搜索来确定。
与 Jesse Chan 的评论类似,您可以考虑将域分解为矩形(3-D 棱镜)形状。然后,一种选择可能是通过使用 2-D(或 3-D)坐标来预计算具有有限元素的空间哈希表来生成密钥。然后,您可以通过散列每个元素的顶点来创建表。
为了有效地找到要计算的元素,您可以散列任意点的坐标然后循环遍历生成的哈希表存储桶中的元素,直到找到需要在其中进行本地计算的元素。如果构建好哈希函数,最终可能会非常快速地查找。