python - 如何找到数值时间序列的多个最大值
问题描述
我正在使用欧拉方法以数值方式(在python中)求解一阶微分方程。我从时间 t=0 开始构建解决方案,直到某个任意时间以 0.05 大小的时间步长进行。得到的解决方案的一个示例如下图所示
我想找到我们在该图中看到的最大值(以及它们发生的时间)并将它们存储在字典中。如果整个时间范围内只有一个最大值,我可以使用此代码
y=[xinitial,viinitial,ainitial]
t=0
maximum=-20000
maxai={}
h=0.05
ai=-2.1
for i in range(0,3701):
dydt=computederivs(y)
y = euler(y,dydt,h)
t+=h
if y[0]>maximum:
maximum = y[0]
maxai[ai]=maximum
由于我有多个局部最大值,我必须在时间 t 移动时检测它们,方法是检查函数在爬升几个时间步后何时下降。我还需要将最大值存储在一个列表中,该列表是字典键的值。我在想象这是一项足够普遍的任务,必须有众所周知的方法来或多或少简单地完成它?
解决方案
我建议使用模块中的find_peaksscipy.signal
。此函数采用一维数组并通过简单比较相邻值来找到所有局部最大值。或者,可以通过指定峰属性的条件来选择这些峰的子集。
这是一个帮助您入门的代码片段:
import matplotlib.pyplot as plt
import numpy as np
from scipy.signal import find_peaks
Fs = 8000
f = 5
sample = 8000
x = np.arange(sample)
y = np.sin(2 * np.pi * f * x / Fs)
peaks = find_peaks(y)
plt.scatter(peaks[0], np.ones(f), c='red')
plt.plot(x, y)
plt.xlabel('sample(n)')
plt.ylabel('voltage(V)')
plt.show()
你的最大值:
print(peaks[0])
[ 400 2000 3600 5200 6800]
推荐阅读
- bash - 将 eGrep 转换为 Grep
- c++ - 如何从 CMake 创建 Visual Studio 2015 解决方案
- google-cloud-firestore - Firestore 批量写入 - 如何限制创建文档的数量?
- mysql - 如何避免使用 Laravel 在选择中重复数据?
- c# - 在 c# 中从 CSV 文件中读取两列
- html - 当屏幕从全屏过渡到小屏时,如何修复内容的 css/html?
- python - 调用 decisionBar() 时,它不会将图像blit到屏幕上
- python - Flask AttributeError:“LoginForm”对象没有属性“userEmail”
- typescript - 如何在 TypeScript 中安全地使用函数属性
- c++ - 是否可以使用旧版 C++ API(版本 1.1.2)连接到 MongoDB Atlas?