【问题标题】:trouble with scipy interpolationscipy插值的问题
【发布时间】:2019-06-02 19:15:31
【问题描述】:

我无法使用 scipy 插值方法从给定的数据点生成漂亮的平滑曲线。我试过使用标准的一维插值,所有选项的 Rbf 插值(三次、高斯、多二次等)

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

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

重点是:

  1. 前两点之间的曲线必须平坦
  2. 曲线不得低于点 1 或 2(即导数不能为负)
  3. 点 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=0x=10(或任何其他变体)的所有点都具有相同的0.00965 y 值。

非常感谢任何帮助。

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

pchip method, better and worse...

【问题讨论】:

  • 感谢@WarrenWeckesser。我已经尝试过 pchip 方法,但也许值得再看一遍,因为其中一些解决方案看起来与我所追求的完全一样。我会回来报告的。
  • 差不多。然而 pchip 方法(现在回想起来确实有问题)在曲线的顶部行为不端。但也许我只需要在它周围添加一个或 2 点来更重地强调这一点。请参阅原始帖子中的新图片。
  • 附加点似乎无法避免明显的“扭结”,因为弯曲部分变得更加线性。似乎我可能需要从 pchip 方法中采样一些点,然后将它们传递给 Rbf 方法。或者完全找到一个不同的解决方案 - 一个允许设置条件的解决方案,例如导数或点权重。
  • 似乎唯一的“可行”解决方案(尽管术语解决方案被轻描淡写地使用)将在第 2 点和第 3 点之间增加一个中间点,并对计算数据进行额外的侧面检查它会查看该点周围的导数,如果结果超出某些条件(例如没有负数,或者它必须始终增加),则会向用户抛出一些错误消息。

标签: python python-3.x scipy interpolation


【解决方案1】:

解决了!

虽然我不确定这是否完全正确,但用于创建贝塞尔曲线的样条曲线工具似乎将控制点视为计算曲线的点必须通过 - 在我的情况下这不是真的。我不知道如何关闭这个功能,所以我找到了贝塞尔曲线的三次公式(我需要三次)并计算了我自己的点。然后我只需要进行一些调整以使这些点符合所需的整数 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 的控制点仅沿与前面/后续部分相同的渐变移动即可。

Perfect result

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2011-07-04
    • 2013-03-04
    • 2017-08-12
    相关资源
    最近更新 更多