重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
有一组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点的导数(差分)为:
即在一个宽度为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)
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。