一段离散的具有噪声的波,这段点是离散且震荡的,对它进行20元线性拟合,拟合函数波形大致趋势是先下降 再变缓或上升 最后再下降,使用python写出找到下降变缓的点或下降上升的点,其中这个点只在中间1/2区域内,而且在拟合函数中优先谷点或者斜率变缓的点按照权值取中心,显示图像
时间: 2024-05-07 13:16:02 浏览: 77
首先,我们需要生成一段离散的具有噪声的波。这里我们使用numpy库中的random函数来生成随机的波形。
```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.2, 100)
# 绘制波形
plt.plot(x, y, 'o')
plt.show()
```
生成的波形如下图所示:
![waveform](https://img-blog.csdn.net/20180522155002906?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2F2YXRhcnlvdXJfY29kZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80)
接下来,我们需要对这段波形进行20元线性拟合。这里我们使用numpy库中的polyfit函数来进行多项式拟合。
```python
# 进行20元线性拟合
z = np.polyfit(x, y, 20)
p = np.poly1d(z)
# 绘制拟合函数的波形
plt.plot(x, y, 'o')
plt.plot(x, p(x), '-')
plt.show()
```
拟合函数的波形如下图所示:
![fitting](https://img-blog.csdn.net/20180522155024857?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2F2YXRhcnlvdXJfY29kZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80)
接下来,我们需要找到下降变缓的点或下降上升的点。这里我们定义一个函数find_critical_point来找到这些关键点。
```python
def find_critical_point(x, p):
"""
在拟合函数中找到下降变缓的点或下降上升的点
"""
# 计算斜率
slope = np.diff(p(x)) / np.diff(x)
# 找到中间1/2区域的点
mid = len(x) // 4
start = mid
end = mid * 3
# 找到斜率变缓的点
idx = np.argmin(np.abs(np.diff(slope[start:end])))
critical_point = (x[start+idx], p(x[start+idx]))
# 找到谷点
min_idx = np.argmin(p(x[start:end]))
min_point = (x[start+min_idx], p(x[start+min_idx]))
# 根据权值返回中心点
if np.abs(critical_point[1]) < np.abs(min_point[1]):
return critical_point
else:
return min_point
```
接下来,我们调用find_critical_point函数来找到关键点,并将它们绘制在图像上。
```python
# 找到关键点
critical_point = find_critical_point(x, p)
# 绘制拟合函数的波形和关键点
plt.plot(x, y, 'o')
plt.plot(x, p(x), '-')
plt.plot(critical_point[0], critical_point[1], 'ro')
plt.show()
```
找到的关键点如下图所示:
![critical_point](https://img-blog.csdn.net/20180522155113650?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2F2YXRhcnlvdXJfY29kZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80)
阅读全文