我有一个二维函数我想采样谁的值。该函数的计算成本非常高,并且它具有复杂的形状,因此我需要找到一种方法来使用最少数量的样本点获取有关其形状的最多信息。
有什么好的方法可以做到这一点?
到目前为止我所拥有的
我从已经计算出函数值的现有点集开始(这可能是点的方格或其他点)。
然后我计算这些点的 Delaunay 三角剖分。
如果 Delaunay 三角剖分中的两个相邻点足够远 () 并且函数值在它们之间有很大的不同 (),然后我在它们中间插入一个新点。我对每个相邻的点对都这样做。
这种方法有什么问题?
好吧,它的效果相对较好,但在与此类似的功能上,它并不理想,因为样本点往往会“跳过”山脊,甚至不会注意到它的存在。
它会产生这样的结果(如果初始点网格的分辨率足够粗糙):
上图显示了计算函数值的点(实际上是它们周围的 Voronoi 细胞)。
上图显示了从相同点生成的线性插值,并将其与 Mathematica 的内置采样方法(对于大约相同的起始分辨率)进行了比较。
如何改进它?
我认为这里的主要问题是我的方法根据梯度决定是否添加细化点。
添加细化点时最好考虑曲率或至少二阶导数。
问题
当我的点的位置根本不受限制时,考虑二阶导数或曲率的一种非常简单的实现方法是什么?(我不一定有一个方格的起点,理想情况下这应该是一般的。)
或者还有哪些其他简单的方法可以以最佳方式计算细化点的位置?
我打算在 Mathematica 中实现这个,但是这个问题主要是关于方法的。对于“易于实现”的部分,我确实在使用 Mathematica(也就是说,到目前为止这很容易做到,因为它有一个用于进行 Delaunay 三角测量的包)
我将此应用于什么实际问题
我正在计算相图。它具有复杂的形状。在一个区域中,它的值为 0,在另一个区域中,它介于 0 和 1 之间。这两个区域之间有一个急剧的跳跃(它是不连续的)。在函数大于零的区域中,存在一些平滑变化和一些不连续性。
函数值是基于 Monte Carlo 模拟计算的,因此有时会出现不正确的函数值或噪声(这种情况很少见,但对于大量点,它会发生,例如,由于由于一些随机因素)
我已经在 Mathematica.SE 上问过这个问题,但我无法链接到它,因为它仍处于私人测试阶段。这里的问题是关于方法,而不是实现。
回复@suki
这是您建议的划分类型,即在三角形中间放置一个新点吗?
我在这里担心的是,它似乎需要在区域边缘进行特殊处理,否则会产生非常长且非常细的三角形,如上图所示。你纠正了吗?
更新
我描述的方法和@suki 建议基于三角形进行细分并将细分点放在三角形内时出现的一个问题是,当存在不连续性时(如我的问题),在一个步骤后重新计算 Delaunay 三角剖分可能导致三角形发生变化,并且可能出现一些在三个顶点具有不同函数值的大三角形。
这里有两个例子:
第一个显示了围绕直线间断进行采样时的最终结果。第二个显示了类似情况的采样点分布。
有什么简单的方法可以避免这种情况?目前,我只是细分那些在重新三角剖分后消失的 egdes,但这感觉像是一个 hack,需要小心完成,因为在对称网格(如方形网格)的情况下,有几个有效的 Delaunay 三角剖分,因此边缘可能会改变重测后随机。