我有一个数字测量列表(见下图)。由于这些测量值不精确,因此每次测量都表示为一对(min,max)
,其中 min
(蓝色)是< =实际值和 max
(红色)> =实际值。
现在我想通过这些最小/最大对来拟合平滑曲线(绿色)。像弯曲一条柔性材料以适应最小/最大对之间。我不是在寻找连续的功能;我只对离散值感兴趣。也就是说,我想为每个(min,max)
对提供一个 smooth
值。
I我确定必须有一个现有的算法。我找不到它。样条似乎是明显的候选者,但我无法弄清楚如何在最小/最大对之间拟合样条曲线。

答案 0 :(得分:0)
有一个强力解决方案,其工作原理如下:
对于每个横坐标,选择三个选项之一
曲线通过最小值
曲线通过最大值
曲线是免费的,不使用此横坐标。
执行所有分配后,通过选定的点计算三次样条曲线。
检查曲线是否在未使用的横坐标上违反最小/最大约束。
对于剩余的有效曲线,计算一个优值数字,例如总曲率的估计值。
保持解决方案达到最低的总曲率。
这仅适用于少量的横纹。在给定的示例中,您应该尝试3 ^ 10 = 59049解决方案!
也许通过使用越来越多的横坐标并保持部分解决方案可以减少复杂性,但这似乎并不严谨。
请注意,当您在三次样条曲线的一侧添加点时,整个曲线会受到影响。但是当你离开时,影响会逐渐减弱,并且侵犯约束的机会应该很低。
另一条攻击线可能是B样条,它具有吸引人的特性,即新点只影响近邻区域的曲线。
答案 1 :(得分:0)
我不知道这是否是一个真正的解决方案,但我认为它至少是解决方案的良好开端。
首先检测" true"解决方案通过的点数:
A"蓝色"点i
是" true"如果point[i].min > point[j].max && point[i].min > point[k].max
lastRedTrue < j < i
和k > i
A&#34; red&#34;点i
是&#34; true&#34;如果point[i].max < point[j].min && point[i].max < point[k].min
lastBlueTrue < j < i
和k > i
在你的例子中,我们得到积分3(分钟),5分(最大值)和9分钟(分钟)
当连续两次&#34; true&#34;时,可能需要进行修正。找到了蓝色或红色。
接下来,开始点。这个想法是
if firstBlue > firstRed
startWith = blue
else
startWith = red
和终点类似的方式。这个想法可能会针对少数情况进行调整。
中间人&#34; true&#34;如果行true[i] to true[i+1]
未在point.min
和point.max
之间传递,则会发现这些点。我的意思是,point.min
和point.max
都位于该行的同一侧,因此point
也是&#34; true&#34;。
在该示例中,新的真实点是2(最大)和7(最大)
其余的点必须不是直线测试,而是曲线通过真点。
最终解决方案可能需要更多测试,因为某些方面会失去其真正的&#34;因为现在相邻线之间的线是弯曲的而不是直的。