【发布时间】:2022-01-19 01:46:23
【问题描述】:
考虑以下 Python 代码,该代码绘制曲线并对其进行分析以找到一些点:
%matplotlib inline
import numpy as np
from numpy.polynomial.polynomial import Polynomial
from scipy.interpolate import UnivariateSpline
from scipy.signal import savgol_filter
import scipy.stats
import scipy.optimize
import matplotlib.pyplot as plt
# Create curve X axis.
x = np.arange(10000)
y = np.zeros_like(x, dtype=float)
# Create a straight line for the first 1000 points.
y[:1000] = (10.0,) * 1000
# The remaining points, create an exponential.
y[1000:] = 20 * np.exp(-x[1000:]/1200.0)
# Add noise.
y += np.random.normal(0, 0.5, x.size)
# Create polynomial.
poly = Polynomial.fit(x, y, 15)
# Create Y values for the polynomial.
py = poly(x)
# Calculate first and second derivatives.
dxdy = np.gradient(py)
dx2dy2 = np.gradient(dxdy)
# Plot original curve and fit on top.
plt.plot(x, y, '', color='black')
plt.plot(x, py, '', color='red')
# Plot first order and second order derivatives.
plt.plot(x, dxdy * 100, '', color='blue')
plt.plot(x, dx2dy2, '', color='green')
我已经在图片上方标记了我要计算的点:
我想我可以用一阶导数来计算第一个,也就是过渡的开始。
我不太确定如何计算第二个,即过渡结束或曲线何时变平。我尝试使用曲线中最后 100 个点的平均值进行计算,并找到曲线中低于该平均值的第一个值,但是,它似乎不太可靠。
编辑1:
在研究一阶导数时,我想出了以下可能的解决方案,即找到峰值左右两侧的符号变化,我用一阶导数和信号的图像进行说明,并在下面拟合:
【问题讨论】:
标签: python numpy machine-learning scipy signal-processing