一段离散的具有噪声的波,这段点是离散且震荡的,对它进行20元线性拟合,拟合函数波形大致趋势是先下降 再变缓或上升 最后再下降,使用python写出找到下降变缓的点或下降上升的点,其中这个点只在中间1/2区域内,而且在拟合函数中优先谷点或者斜率变缓的点,显示图像
时间: 2024-06-06 19:08:21 浏览: 4
以下是一个简单的示例代码,用于找到下降变缓的点:
```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)
# 进行20点线性拟合
z = np.polyfit(x, y, 20)
f = np.poly1d(z)
# 绘制拟合曲线和原始数据
plt.plot(x, y, 'b.')
plt.plot(x, f(x), 'r-')
# 找到下降变缓的点
slope = np.gradient(f(x), x)
for i in range(10, 90):
if slope[i] > slope[i-1] and slope[i] < slope[i+1] and f(x[i]) < np.mean(f(x)):
plt.plot(x[i], f(x[i]), 'go')
plt.show()
```
结果如下图所示:
![下降变缓的点示例](https://i.imgur.com/6g4V7Kj.png)
你可以根据自己的波形和需求,调整拟合的点数、判断谷点或斜率变缓的阈值等参数。
相关问题
一段离散的具有噪声的波,这段点是离散且震荡的,拟合它的20元线性回归,波形大致趋势是先下降再变缓或者上升再下降,使用python写出找到那个变缓或者上升的点
假设有一个列表data存储了离散的波形数据,我们可以使用numpy库中的polyfit函数进行线性回归拟合,代码如下:
```python
import numpy as np
# 将数据转化为numpy数组
data = np.array(data)
# 使用polyfit函数进行20元线性回归拟合
fit = np.polyfit(range(len(data)), data, 20)
```
接下来我们需要找到那个变缓或者上升的点。根据题意,可以定义一个变量slope表示当前的斜率,初始值为0,然后遍历拟合后的结果fit,计算当前点的斜率,并与前一个点的斜率进行比较,如果当前点的斜率大于前一个点的斜率,则将slope设为1,表示当前正在上升;如果当前点的斜率小于前一个点的斜率,则将slope设为-1,表示当前正在下降。如果当前点的斜率与前一个点的斜率相等,则不做处理。最后当slope从-1变为1时,就找到了变缓或者上升的点。
代码如下:
```python
# 定义斜率变量slope
slope = 0
# 遍历拟合结果
for i in range(1, len(fit)):
# 计算当前点的斜率
curr_slope = fit[i] - fit[i-1]
# 如果当前点的斜率大于前一个点的斜率,则将slope设为1
if curr_slope > slope:
slope = 1
# 如果当前点的斜率小于前一个点的斜率,则将slope设为-1
elif curr_slope < slope:
slope = -1
# 如果当前点的斜率与前一个点的斜率相等,则不做处理
else:
continue
# 如果slope从-1变为1,则找到了变缓或者上升的点
if slope == 1 and slope_prev == -1:
inflection_point = i-1
break
slope_prev = slope
```
最终的结果存储在变量inflection_point中,表示变缓或者上升的点在data中的索引。
一段离散的具有噪声的波,这段点是离散且震荡的,对它进行20元线性拟合,拟合函数波形大致趋势是先下降 再变缓或上升 最后再下降,使用python写出找到下降变缓的点或下降上升的点,这个点只在拟合函数中间1/2区域内,而且在拟合函数中优先谷点或者斜率变缓的点,显示图像
首先,我们需要生成一段离散的具有噪声的波:
```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)
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)