scipy 插值问题

trouble with scipy interpolation

我在使用 scipy 插值方法从给定的数据点生成漂亮的平滑曲线时遇到了问题。我试过使用标准的一维插值、具有所有选项的 Rbf 插值(立方、高斯、多二次等)

在所提供的图像中,蓝线是原始数据,我希望首先平滑锐利的边缘,然后拥有动态可编辑的点,从中重新计算曲线。每次编辑单个点时,它应该自动计算某种新的样条曲线以在每个点之间平滑过渡。 当点在彼此的特定范围内时,它会起作用,如下所示。

但是如果点最终相距太远或太近,我最终会遇到如下问题。

要点是:

  1. 前两点之间的曲线必须平坦
  2. 曲线不得低于点 1 或 2(即导数不能为负)
  3. ~点 2 和点 3 之间的 15 个点(未显示)也是可编辑的,它们之间的线不一定是线性的。必须完全控制每个点,穿过每个点的曲线也是如此。

我很乐意将其分解成更小的曲线,然后 join/convolve,但只需要确保梯度 >0。

示例数据:

x=[0, 37, 50, 105, 115,120]
y=[0.00965, 0.00965, 0.047850827205882, 0.35600416666667, 0.38074375,  0.38074375]

例如,尝试将点 2 (x=37) 移动到极值,比如 10(保持 y 不变)。只需确保从 x=0x=10(或任何其他变体)的所有点都具有相同的 y 值 0.00965

非常感谢任何帮助。

更新 尝试了评论中建议的 pchip 方法,结果如下:

pchip method, better and worse...

已解决!

虽然我不确定这是否完全正确,但就好像用于创建贝塞尔曲线的样条工具将控制点视为计算曲线的点 must 通过 - 这对我来说不是真的。我不知道如何关闭这个功能,所以我找到了贝塞尔曲线的三次公式(我需要三次)并计算了我自己的点数。然后我只需要做一点调整以使点符合所需的整数 x 值 - 在我的情况下,足够接近就足够了。否则我需要在所需 x 值两侧的两点之间进行线性插值并确定确切值。

对于那些感兴趣的人,立方体需要 4 个点 - 起点、终点和 2 个控制点。规则是:

B(t) = (1-t)^3 P0 + 3(1-t)^2 tP1 + 3(1-t)t^2 P2 + t^3 P3

使用 t 的值列表分别计算 x 和 y。如果需要梯度匹配,只需确保 P1 和 P2 的控制点仅沿与 preceding/proceeding 部分相同的梯度移动。

Perfect result