一段离散的具有噪声的波,这段点是离散且震荡的,对它进行20元线性拟合,拟合函数波形大致趋势是先下降 再变缓或上升 最后再下降,使用python写出找到下降变缓的点或下降上升的点,这个点只在拟合函数中间1/2区域内,而且在拟合函数中优先谷点或者斜率变缓的点,显示图像
时间: 2024-05-20 08:17:25 浏览: 78
首先,我们需要生成一段离散的具有噪声的波:
```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()
```
接下来,我们可以使用`numpy.polyfit()`函数进行20元线性拟合,并将拟合函数绘制出来:
```python
# 进行20元线性拟合
z = np.polyfit(x, y, 20)
p = np.poly1d(z)
# 绘制拟合函数
xp = np.linspace(0, 10, 100)
plt.plot(x, y, 'o', xp, p(xp), '-')
plt.show()
```
接下来,我们可以找到下降变缓的点或下降上升的点:
```python
# 找到下降变缓的点或下降上升的点
dy = np.gradient(p(xp))
d2y = np.gradient(dy)
inflection_points = xp[(d2y > 0) & (dy < 0)]
valley_points = xp[(d2y > 0) & (dy > 0)]
# 绘制结果
plt.plot(x, y, 'o', xp, p(xp), '-', inflection_points, p(inflection_points), 'o', valley_points, p(valley_points), 'o')
plt.legend(['data', 'polynomial fit', 'inflection points', 'valley points'], loc='best')
plt.show()
```
完整代码如下:
```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)
# 进行20元线性拟合
z = np.polyfit(x, y, 20)
p = np.poly1d(z)
# 绘制拟合函数
xp = np.linspace(0, 10, 100)
plt.plot(x, y, 'o', xp, p(xp), '-')
# 找到下降变缓的点或下降上升的点
dy = np.gradient(p(xp))
d2y = np.gradient(dy)
inflection_points = xp[(d2y > 0) & (dy < 0)]
valley_points = xp[(d2y > 0) & (dy > 0)]
# 绘制结果
plt.plot(inflection_points, p(inflection_points), 'o', valley_points, p(valley_points), 'o')
plt.legend(['data', 'polynomial fit', 'inflection points', 'valley points'], loc='best')
plt.show()
```
结果图像如下:
![plot](https://i.loli.net/2021/06/16/5PZxNz7Vvc1pG9X.png)
阅读全文