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