Python求离散序列导数的示例

  

有一组4096长度的数据,需要找到一阶导数从正到负的点,和三阶导数从负到正的点,截取了一小段。
  

  

394.0
  388.0
  389.0
  388.0
  388.0
  392.0
  393.0
  395.0
  395.0
  394.0
  394.0
  390.0
  

392.0   

按照之前所了解的,对离散值求导其实就是求差分,例如第我点的导数(差分)为:

  

 Python求离散序列导数的示例

  

即在一个宽度为2 m + 1的窗口内通过计算前后m个值加权后的和得到。但是在实际使用过程中效果不是很好。于是想到了同样在一个宽度为2 k + 1的窗口内,将这2 k + 1个点拟合成一个函数,然后求导就可以得到任意阶数的导数值。

  

首先是函数拟合,使从scipy用。优化进口leastsq即最小二乘拟合
  

        从scipy。优化进口leastsq   类搜索(对象):   def __init__(自我,文件名):   自我。文件名=文件名      def func(自我,x, p):   f=np.poly1d (p)   返回f (x)      def残差(自我,p, x, y, reg):   正规化=0.1 #正则化系数λ   ret=y -自我。func (x, p)   如果reg==1:   ret=np。追加(ret, np.sqrt(正规化)* p)   返回受潮湿腐烂      def LeastSquare(自我,数据、k=100=4, reg=1,显示=1):# k为求导窗口宽度,顺序为多项式阶数,注册为是否正则化   l=self.len=2 * k + 1步   p=[1] *秩序   因为我在范围(0 l步骤):   如果我+ & lt;李:   [我+ y=数据步骤)   x=np。论坛(我+步骤)   其他:   y=数据(我)   x=np。不等(左)   试一试:   r=leastsq(自我。残差,p, args=(x, y, reg))   除了:   print(“错误——curve_fit失败”)   有趣=np.poly1d (r[0]) #返回拟合方程系数   df_1=np.poly1d.deriv(有趣)#求得导函数   df_2=np.poly1d.deriv (df_1)   df_3=np.poly1d.deriv (df_2)   df_value=https://www.yisu.com/zixun/df_1 (x)   df3_value=df_3 (x)      

有趣=np.poly1d (r[0]),乐趣返回的是一个多项式类,具体使用可以见官方文档numpy。poly1d
  多项式对象可以使用导数方法求导数,求得的依然是多项式对象。df_value=https://www.yisu.com/zixun/df_1 (x)所得到的就这是x个几个点求得的导数值。

  

看似大功告成,但是求导的结果并不是很好,如下图,实际最高点在100左右,但是拟合出来的曲线最高点在120左右,而原因在于使用多项式拟合很难准确拟合曲线。

  

 Python求离散序列导数的示例

  

于是想用高斯函数来实现对曲线的拟合,在matlab中试了下,三阶高斯拟合可以很好的拟合曲线,

  

 Python求离散序列导数的示例

  

但是numpy以及sicpy中没有找到类似poly1d这种对象,虽然可以自己定义高斯函数,如下

        def高斯(自我、x *参数):   有趣=参数[0]* np.exp (np。权力(x - param [2], 2)/(2 * np。功率(param[4], 2))) +参数[1]* np.exp (np。权力(x - param [3], 2)/(2 * np。功率(param [5], 2)))   返回有趣      

但是,在通过最小二乘拟合得到函数参数后只能得到拟合后的点,无法直接求导数,所以并不适合。

  

所以还是只能回到多项式拟合,如果4阶多项式不能表征的话,更高阶的呢
  

  

 Python求离散序列导数的示例

  

总体来说,效果还是可以接受的。

  

如果下阶段找到好的高斯函数拟合方法,会继续更新。

  

以上这篇Python求离散序列导数的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

Python求离散序列导数的示例