Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带粉红噪声的时滞微分方程_Python_Differential Equations_Stochastic - Fatal编程技术网

Python 带粉红噪声的时滞微分方程

Python 带粉红噪声的时滞微分方程,python,differential-equations,stochastic,Python,Differential Equations,Stochastic,我需要解一组延迟微分方程,我想在这些方程中使用粉红噪声 我尝试使用Pydelay包for Python来实现这一点,但问题是我需要生成噪声,然后将其传递给模拟,或者在模拟过程中生成噪声。第一个选项不起作用,因为此解算器中指定的参数需要保持不变,并且噪波会随时间变化。第二个选项不起作用,因为Pydelay只支持生成每个样本都独立于其他样本的噪声,而粉红噪声则不支持 有人知道怎么做吗 这是我的代码(我需要I1和I2是粉红色的噪音,而不是像我的代码中那样恒定): 那么问题是为数据集中的所有元素生成粉红

我需要解一组延迟微分方程,我想在这些方程中使用粉红噪声

我尝试使用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的所有限制。因此,最好的解算器将是一个单步方法,积分步骤将所有延迟分开。快速浏览一下文献,这确实是我们所做的。请注意,这并不能解决粉红色噪音的问题

如前所述,Pydelay使用带插值的多步方法。这不是为随机性设计的,也不能正确处理随机性(如果是的话,它将是SDE的一个出色的解决方案,即毫不延迟)。相反,它所做的是将多步方法视为单步方法,然后添加噪声。正如Pydelay的作者自己所说,这“相当粗糙”。此外,实际使用粉红噪声(即使使用粗糙的方法)将需要重新编程软件,并可能导致积分器的误差估计器出现固有问题。我强烈建议不要这样做。即使您成功了,使用高级DDE解算器(例如,自适应步骤)的所有优点都将丢失,因此从头开始编写新的、更简单的积分器会更容易

如果您真的需要这样做,我建议您首先找出如何解决带有粉红色噪声的SDE,然后将该方法扩展到SDDE(希望这是相当简单的)



如果你想有观测噪声,那很简单:只需将其添加到你的解决方案中。

你认为添加工作代码有助于描述问题吗?那么问题是产生粉红色噪声?
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