【问题标题】:How to remove spikes in solution and produce smooth interpolation with scipy?如何去除溶液中的尖峰并使用 scipy 产生平滑插值?
【发布时间】:2021-12-03 06:56:55
【问题描述】:

我正在写一个偏积分微分方程的数值解,我需要它快速运行,所以我发现 scipy.integrate.simps 是最好的,但它并不总是 100% 准确,并且会在 [ 1]。我的解决方案是用 scipy.signal.medfilt 删除它们,然后用插值器在间隙上插值(我尝试过 CubicSpline、PChipInterpolator、scipy.interp1d、akima ......)但它们都在在 y=0.1 处可以看到的解(使用 3 阶巴特沃斯滤波器产生)并且这些误差随着解的演变而增长。如何去除尖峰并在间隙上获得简单、平滑的插值?谢谢!

【问题讨论】:

  • 你的数据是什么?我看到一个对数 x 刻度,对我来说这表明您的 x 值不是(大致)线性间隔的。你能在你的问题中添加一些示例 x-y 数据吗?加上你正在执行的代码?
  • @9769953 我已附上示例数据和代码!
  • 我认为您需要做更多的工作才能使您的示例可重现。我们应该能够将代码复制/粘贴到笔记本或脚本中,执行它,然后查看您描述的问题
  • FORTRAN 从何而来?您是否与使用 FORTRAN 计算的结果进行比较?为此使用了什么代码?
  • @9769953 ya FORTRAN 代码仅用于比较。虽然这不是我的代码。尽管还尝试将 FORTRAN 代码与 f2py 一起使用的自适应高斯积分器包装在我的代码中而不是 simps 中,因为 FORTRAN 代码的运行速度比我的快得多,但我的代码仍然非常慢,就像使用 scipy.dblquad 一样跨度>

标签: python scipy signal-processing interpolation numerical-computing


【解决方案1】:

我不使用 scipy,但根据我收集到的信息,有些事情对我来说很突出,可能是导致问题的原因。

  • 在您使用 medfilt() 过滤掉异常值之前,您调用了显示数据的 plt.show(),因此更正后的数据可能不会出现在您的图中
  • 我收集的中值过滤器不会从您的数据中删除异常值,而是使用其 k 邻居中的中值重置每个数据点。
  • 考虑到这一点,我有两个建议,(1) 您的中值滤波器窗口可能太小,这会导致异常值无法被删除。尝试使用medfilt(self.n_, k_size=5) 自己设置它,它默认为 3,因此请尝试大于 3 的奇数。(2)鉴于您不会因使用 medfilter 而丢失数据点,您可能不需要跟随它的行尝试插入可能被删除的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 2019-06-23
    • 2014-05-29
    • 2012-12-28
    相关资源
    最近更新 更多