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
按照之前所了解的,对离散值求导其实就是求差分,例如第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许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网页标题:Python求离散序列导数的示例-创新互联
当前URL:http://www.jxjierui.cn/article/jcgic.html


咨询
建站咨询
