Python求离散序列导数的示例


Posted in Python onJuly 10, 2019

有一组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

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

Python求离散序列导数的示例

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

首先是函数拟合,使用from scipy.optimize import leastsq即最小二乘拟合

from scipy.optimize import leastsq
class search(object):
  def __init__(self, filename):
    self.filename = filename

  def func(self, x, p):
    f = np.poly1d(p)
    return f(x)

  def residuals(self, p, x, y, reg):
    regularization = 0.1 # 正则化系数lambda
    ret = y - self.func(x, p)
    if reg == 1:
      ret = np.append(ret, np.sqrt(regularization) * p)
    return ret

  def LeastSquare(self, data, k=100, order=4, reg=1, show=1): # k为求导窗口宽度,order为多项式阶数,reg为是否正则化
    l = self.len
    step = 2 * k + 1
    p = [1] * order
    for i in range(0, l, step):
      if i + step < l:
        y = data[i:i + step]
        x = np.arange(i, i + step)
      else:
        y = data[i:]
        x = np.arange(i, l)
      try: 
        r = leastsq(self.residuals, p, args=(x, y, reg))
      except:
        print("Error - curve_fit failed")
      fun = np.poly1d(r[0]) # 返回拟合方程系数
      df_1 = np.poly1d.deriv(fun) # 求得导函数
      df_2 = np.poly1d.deriv(df_1)
      df_3 = np.poly1d.deriv(df_2)
      df_value = df_1(x)
      df3_value = df_3(x)

fun = np.poly1d(r[0]),fun返回的是一个 polynomial class,具体使用可以见官方文档numpy.poly1d
polynomial对象可以使用deriv方法求导数,求得的依然是 polynomial对象。 df_value = df_1(x)所得到的就是x这个几个点求得的导数值。

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

Python求离散序列导数的示例

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

Python求离散序列导数的示例

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

def gaussian(self, x, *param):
    fun = param[0]*np.exp(-np.power(x - param[2], 2.) / (2 * np.power(param[4],    2.)))+param[1]*np.exp(-np.power(x - param[3], 2.) / (2 * np.power(param[5], 2.)))
    return fun

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

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

Python求离散序列导数的示例

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

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

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

Python 相关文章推荐
Python语言编写电脑时间自动同步小工具
Mar 08 Python
跟老齐学Python之有点简约的元组
Sep 24 Python
python编程通过蒙特卡洛法计算定积分详解
Dec 13 Python
Python操作MySQL数据库的方法
Jun 20 Python
Django中的ajax请求
Oct 19 Python
Django CBV类的用法详解
Jul 26 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
Apr 18 Python
Python3操作Excel文件(读写)的简单实例
Sep 02 Python
Python基础之函数原理与应用实例详解
Jan 03 Python
python+selenium+PhantomJS抓取网页动态加载内容
Feb 25 Python
Django Form设置文本框为readonly操作
Jul 03 Python
Python类成员继承重写的实现
Sep 16 Python
Python Matplotlib 基于networkx画关系网络图
Jul 10 #Python
我们为什么要减少Python中循环的使用
Jul 10 #Python
详解Python中的各种转义符\n\r\t
Jul 10 #Python
使用python画社交网络图实例代码
Jul 10 #Python
python 绘制拟合曲线并加指定点标识的实现
Jul 10 #Python
python 寻找离散序列极值点的方法
Jul 10 #Python
Python中面向对象你应该知道的一下知识
Jul 10 #Python
You might like
PHP遍历数组的几种方法
2012/03/22 PHP
PHP If Else(elsefi) 语句
2013/04/07 PHP
使用php get_headers 判断URL是否有效的解决办法
2013/04/27 PHP
PHP依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
通过$(this)使用jQuery包装后的方法或属性
2014/05/18 Javascript
JQuery中上下文选择器实现方法
2015/05/18 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
vuejs事件中心管理组件间的通信详解
2017/08/09 Javascript
使用js获取伪元素的content实例
2017/10/24 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
[37:45]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS Orenda
2014/05/22 DOTA
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
在Python的列表中利用remove()方法删除元素的教程
2015/05/21 Python
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
python制作一个桌面便签软件
2015/08/09 Python
Python字典,函数,全局变量代码解析
2017/12/18 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
python 实现12bit灰度图像映射到8bit显示的方法
2019/07/08 Python
Python图像处理PIL各模块详细介绍(推荐)
2019/07/17 Python
python实现多进程通信实例分析
2019/09/01 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
2020/03/30 Python
Python获取浏览器窗口句柄过程解析
2020/07/25 Python
Ubuntu20下的Django安装的方法步骤
2021/01/24 Python
Django中template for如何使用方法
2021/01/31 Python
狗狗玩具、零食和咀嚼物的月度送货服务:Super Chewer
2018/08/22 全球购物
葡萄牙航空官方网站:TAP Air Portugal
2019/10/31 全球购物
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
2014年检验科工作总结
2014/11/22 职场文书
2014员工聘用协议书(最新版)
2014/11/24 职场文书
股份转让协议书范本
2015/01/27 职场文书
2015暑期社会实践通讯稿
2015/07/18 职场文书
Django+Nginx+uWSGI 定时任务的实现方法
2022/01/22 Python