【发布时间】:2019-06-02 19:15:31
【问题描述】:
我无法使用 scipy 插值方法从给定的数据点生成漂亮的平滑曲线。我试过使用标准的一维插值,所有选项的 Rbf 插值(三次、高斯、多二次等)
在提供的图像中,蓝线是原始数据,我希望首先平滑锐利的边缘,然后使用动态可编辑的点来重新计算曲线。每次编辑单个点时,它应该自动计算某种新的样条曲线以在每个点之间平滑过渡。 当这些点彼此处于特定范围内时,它会起作用,如下所示。
但如果这些点最终相距太远或太靠近,我最终会遇到以下问题。
重点是:
- 前两点之间的曲线必须平坦
- 曲线不得低于点 1 或 2(即导数不能为负)
- 点 2 和 3 之间的约 15 个点(未显示)也是可编辑的,并且之间的线不一定是线性的。必须完全控制这些点中的每一个,以及穿过它们的曲线。
我很乐意将它分解成更小的曲线,然后我加入/卷积,但只需要确保 >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=0 到x=10(或任何其他变体)的所有点都具有相同的0.00965 y 值。
非常感谢任何帮助。
更新 cmets中建议的尝试pchip方法,结果如下:
【问题讨论】:
-
感谢@WarrenWeckesser。我已经尝试过 pchip 方法,但也许值得再看一遍,因为其中一些解决方案看起来与我所追求的完全一样。我会回来报告的。
-
差不多。然而 pchip 方法(现在回想起来确实有问题)在曲线的顶部行为不端。但也许我只需要在它周围添加一个或 2 点来更重地强调这一点。请参阅原始帖子中的新图片。
-
附加点似乎无法避免明显的“扭结”,因为弯曲部分变得更加线性。似乎我可能需要从 pchip 方法中采样一些点,然后将它们传递给 Rbf 方法。或者完全找到一个不同的解决方案 - 一个允许设置条件的解决方案,例如导数或点权重。
-
似乎唯一的“可行”解决方案(尽管术语解决方案被轻描淡写地使用)将在第 2 点和第 3 点之间增加一个中间点,并对计算数据进行额外的侧面检查它会查看该点周围的导数,如果结果超出某些条件(例如没有负数,或者它必须始终增加),则会向用户抛出一些错误消息。
标签: python python-3.x scipy interpolation