举一个离散点先光滑拟合在求导寻峰的例子
时间: 2024-04-08 18:28:34 浏览: 158
三维-离散点-曲面光滑-拟合
4星 · 用户满意度95%
好的,下面是一个离散点先进行光滑拟合,然后求导寻峰的例子:
```python
import numpy as np
import matplotlib.pyplot as plt
# 生成示例数据
x = np.linspace(0, 10, 100)
y = np.sin(x) + np.random.normal(0, 0.1, size=100)
# 光滑拟合
smooth_x = np.linspace(x.min(), x.max(), 1000)
smooth_y = np.interp(smooth_x, x, y) # 线性插值
# 计算一阶导数
dy = np.gradient(smooth_y, smooth_x)
# 设置阈值
threshold = 0.5
# 寻找峰值点
peak_indices = []
for i in range(1, len(dy) - 1):
if dy[i] > dy[i-1] and dy[i] > dy[i+1] and dy[i] > threshold:
peak_indices.append(i)
# 绘制结果
plt.figure(figsize=(8, 6))
plt.scatter(x, y, label="Data", color="blue")
plt.plot(smooth_x, smooth_y, label="Smoothed Data", color="red")
plt.plot(smooth_x[peak_indices], smooth_y[peak_indices], 'ro', label="Peaks")
plt.legend()
plt.xlabel("x")
plt.ylabel("y")
plt.title("Smoothing and Peak Finding of Discrete Data")
plt.show()
```
在这个例子中,我们首先生成了一个带有噪声的离散点数据。然后,我们使用线性插值`np.interp`将数据进行光滑拟合,得到更平滑的曲线。
接下来,我们计算了光滑曲线的一阶导数,以寻找峰值点。通过遍历一阶导数序列,找到满足条件的峰值点,包括当前点的一阶导数值大于前一个点和后一个点的一阶导数值,以及大于设定的阈值。
最后,我们使用Matplotlib库绘制了原始数据点、光滑曲线以及找到的峰值点。原始数据点用蓝色的散点图表示,光滑曲线用红色线条表示,峰值点用红色圆圈标记。
通过先进行光滑拟合再求导寻峰,可以在一定程度上降低噪声的影响,并找到离散数据中的峰值点。根据具体需求,可以调整阈值和光滑拟合的方法,以获得更准确的峰值检测结果。
阅读全文