Python 带粉红噪声的时滞微分方程
我需要解一组延迟微分方程,我想在这些方程中使用粉红噪声 我尝试使用Pydelay包for Python来实现这一点,但问题是我需要生成噪声,然后将其传递给模拟,或者在模拟过程中生成噪声。第一个选项不起作用,因为此解算器中指定的参数需要保持不变,并且噪波会随时间变化。第二个选项不起作用,因为Pydelay只支持生成每个样本都独立于其他样本的噪声,而粉红噪声则不支持 有人知道怎么做吗 这是我的代码(我需要I1和I2是粉红色的噪音,而不是像我的代码中那样恒定):Python 带粉红噪声的时滞微分方程,python,differential-equations,stochastic,Python,Differential Equations,Stochastic,我需要解一组延迟微分方程,我想在这些方程中使用粉红噪声 我尝试使用Pydelay包for Python来实现这一点,但问题是我需要生成噪声,然后将其传递给模拟,或者在模拟过程中生成噪声。第一个选项不起作用,因为此解算器中指定的参数需要保持不变,并且噪波会随时间变化。第二个选项不起作用,因为Pydelay只支持生成每个样本都独立于其他样本的噪声,而粉红噪声则不支持 有人知道怎么做吗 这是我的代码(我需要I1和I2是粉红色的噪音,而不是像我的代码中那样恒定): 那么问题是为数据集中的所有元素生成粉红
那么问题是为数据集中的所有元素生成粉红色噪声
def voss(nrows, ncols=16):
"""Generates pink noise using the Voss-McCartney algorithm.
nrows: number of values to generate
rcols: number of random sources to add
returns: NumPy array
"""
array = np.empty((nrows, ncols))
array.fill(np.nan)
array[0, :] = np.random.random(ncols)
array[:, 0] = np.random.random(nrows)
# the total number of changes is nrows
n = nrows
cols = np.random.geometric(0.5, n)
cols[cols >= ncols] = 0
rows = np.random.randint(nrows, size=n)
array[rows, cols] = np.random.random(n)
df = pd.DataFrame(array)
df.fillna(method='ffill', axis=0, inplace=True)
total = df.sum(axis=1)
return total.values
来源:我假设您想要动态噪声。在这种情况下,您应该首先意识到有几种类型的微分方程具有根本不同的解算器:
- 延迟微分方程(DDE)通常通过以下任一方法求解:
- 嵌入式多步龙格-库塔方法,其中对过去进行插值(Pydelay就是这样做的)
- 积分步长除以所有延迟的单步积分器
- 随机微分方程(SDE)采用简单的单步方法(均基于Euler方法)求解。多步方法仍然是一个热门话题,嵌入式方法只是最近才被提出
关于SDE的所有论文我都知道(理论和方法,但它们并不是那么多),只考虑白噪声(Wiener过程);认识到粉色噪音本身就是一个问题。我能找到的只是一个快速搜索
- 随机延迟微分方程(SDDE)同样需要特殊的解算器。我对它们不是很熟悉,但很明显,您至少继承了DDE和SDE的所有限制。因此,最好的解算器将是一个单步方法,积分步骤将所有延迟分开。快速浏览一下文献,这确实是我们所做的。请注意,这并不能解决粉红色噪音的问题
如果你想有观测噪声,那很简单:只需将其添加到你的解决方案中。你认为添加工作代码有助于描述问题吗?那么问题是产生粉红色噪声?
def voss(nrows, ncols=16):
"""Generates pink noise using the Voss-McCartney algorithm.
nrows: number of values to generate
rcols: number of random sources to add
returns: NumPy array
"""
array = np.empty((nrows, ncols))
array.fill(np.nan)
array[0, :] = np.random.random(ncols)
array[:, 0] = np.random.random(nrows)
# the total number of changes is nrows
n = nrows
cols = np.random.geometric(0.5, n)
cols[cols >= ncols] = 0
rows = np.random.randint(nrows, size=n)
array[rows, cols] = np.random.random(n)
df = pd.DataFrame(array)
df.fillna(method='ffill', axis=0, inplace=True)
total = df.sum(axis=1)
return total.values