实验数据的局部最小值

Local minimum of experimental data

我有一个代码可以在每个时间步输出一个数据数组,这里有 2 个时间步:

我的objective是求那个洞的最小值的坐标和值。如您所见,有多个局部最小值。我想找到所有这些值中最小的值将对应于宽孔左侧(v=0.35 左右)的最细孔(v=0.15 左右)。

我有一个算法,它使用另一个函数找到一个值来开始搜索最小值,它是 f-f0f0 是高斯函数),这给了我这样的函数:

我首先找到 f-f0 函数的最小值,然后我使用该坐标找到 f 函数的局部最小值。

我用一个超级简单的取景器找到了它。它包括获取该起始值,然后创建一个具有左右值的新数组,找到该数组的最小值,如果我得到的最小值与我在上一步中得到的相同,那么这些就是坐标最小值,如果不重复的话。

这个方法让我可以找到起始位置的局部最小值,并且因为它是对称的(我在左右添加相同数量的点)我总是得到起始位置左侧的最小值位置(即宽孔)。但是我不想要那个,我想要最深的洞。有时最深对应于我计算的那个(即红色函数),有时它不对应于最深(即蓝色曲线)。

注意:我是用 Fortran 做的,但是如果你不懂 Fortran,你可以给我 idea/algorithm,或者用 python 写出来,我可以翻译到 Fortran。

谢谢。

目前还不清楚您将如何处理这个问题,因为似乎任何算法都必须根据您生成的输出的特定 type/shape 以及您希望左右边界的位置进行调整是为了搜索。如果您的函数只是像您所说的那样输出“数据数组”,请找到一些方法来找出“洞”的合理左右限制,然后在其中寻找 min(array[left:right]) 。一个简单的算法可能会陷入情节左侧的第一个坑中......所以我认为你的挑战是以某种方式“限制洞的峰顶”。

经过一番思考,我找到了解决方案。

之前我搜索 f-f0 函数的最小值,现在我搜索 f-f0 的最小值和最大值。这样做的原因是这个函数总是在离最大值 f 的最远端有最大值,在最近的 f 有最小值。这是由于高斯函数的对称性,因此如果空洞在 f 的最大值左侧(即本例),则最大值将在 f-f0 的最小值左侧, 并且在洞中是 f 的最大值的右侧,那么最大值将在 f-f0 的最小值的右侧。

找到这两个点后,我使用 MINLOC(f-f0)MAXLOC(f-f0) 得到它们的坐标。然后我创建一个大小为 |imin-imax| 的新数组,其中我复制了 f 对应于这些坐标的点。 (我创建了一个新数组,因为我用这个数组做了其他事情,但这不是必需的。我需要的只是最小值,然后只需缩短数组的限制,而不是 f(imin:imax)

然后我搜索这个新数组的最小值和坐标。然后我将其转换为 f.

上位置的实际坐标

最后我得到了f的最小值及其坐标v的值。