如何去除溶液中的尖峰并使用scipy产生平滑插值?



我正在编写一个偏积分-微分方程的数值解,我需要它快速运行,所以我发现scipy. integration .simps是最好的,但它并不总是100%准确,并产生[1]中的峰值。我的解决方案是用scipy.signal.medfilt删除它们,然后用插值器对间隙进行插值(我尝试过CubicSpline, PChipInterpolator, scipy.interp1d, akima,…),但它们都会产生小的"打嗝"。在溶液中,可以看到y=0.1,(由三阶巴特沃斯滤波器产生),这些误差随着溶液的发展而增长。我如何删除尖峰,并得到一个简单的,平滑的插值在间隙?谢谢!

我不使用scipy,但是从我收集到的信息来看,有一些事情引起了我的注意,这些事情可能就是导致问题的原因。

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

最新更新