我正在使用Euler方法数值(在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中移动时,我必须通过某种方式检查函数在爬升几个时间步后下降的时间来检测它们。我还需要将最大值存储在列表中,该列表是字典键的值。 我在想这是一项足够普遍的任务,必须以众所周知的方式或多或少地简单地完成它?
答案 0 :(得分:3)
我建议使用scipy.signal
模块中的find_peaks。 此函数采用一维数组,并通过简单比较相邻值来查找所有局部最大值。 (可选)可以通过指定峰属性的条件来选择这些峰的子集。
下面是一个代码片段,可以帮助您入门:
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]
答案 1 :(得分:2)
您应该寻找的事件是一阶导数Parent parent = FXMLLoader.load(getClass().getResource("your fxml file.fxml"));
JFXDialogLayout dialogLayout = new JFXDialogLayout();
dialogLayout.setBody(parent);
JFXDialog dialog = new JFXDialog(stackpane, dialogLayout, JFXDialog.DialogTransition.BOTTOM);
dialog.show();
更改其符号时。要获得最大值,请测试二阶导数v
是否为负。
a
您可以使用线性插值来获得最大位置的更精确的纵坐标。
如果要获得重大结果,请采用更高阶的ODE集成方法。