是否有可能在列表中找到波动,使得图形达到某个峰值,它将开始在两个未知的值之间波动。
我正在考虑关注超过阈值的所有数字
我已经编写了一些python代码来模拟这个问题。图表首先会增加到n
值,并且会在两个值m
和k
之间波动。
背景
代码模拟时间网络上的分区SIS模型。也就是说,每个节点都在其中一个隔间中(易感 - 感染 - 易感)。感染传播每个受感染的节点tryign以概率感染相邻节点,并在每个时间步以概率恢复。
如果感染低于阈值 ,感染将会消失。 那么代码的作用是,它运行一段时间(True)循环检查感染是否消失,如果它高于感染的覆盖率是40%。在这两个if语句之间,感染进入稳定状态,即它高于阈值但低于40%的覆盖率,并且它在无限长的时间内波动。我正试图找到一种方法来查找列表中的波动。
模拟这种情况的代码(图表):
import random
import numpy as np
import matplotlib.pyplot as plt
n = 10
m = 11
k = 17
a = np.arange(0, n, 1)
a = np.asarray(a)
for i in range(100):
a = np.append(a, random.randint(m, k))
plt.plot(a)
plt.show()
答案 0 :(得分:1)
溶液振荡的区域可以通过相对最大值和最小值的存在来检测。 SciPy的信号处理模块有several methods来查找它们。例如:
from scipy.signal import argrelmin, argrelmax
extrema = np.concatenate((argrelmin(a)[0], argrelmax(a)[0]))
print((extrema.min(), extrema.max()))
打印(12,108)模拟数据,振荡的开始和结束。开始标志着从增长到振荡的转变,结束只是观察的结束。
这种简单的方法不适用于振荡叠加在生长/衰减模式上的情况,如函数f(x) = x + 2*sin(x)
。但是根据您对数据的描述似乎已经足够了。