具有粉红噪声的延迟微分方程

时间:2017-01-13 12:14:40

标签: python differential-equations stochastic

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

我尝试使用Python的Pydelay程序包,但问题是我需要生成噪声然后将其传递给模拟或在模拟过程中生成噪声。第一个选项不起作用,因为此求解器中指定的参数需要保持不变,并且噪声会随时间而变化。第二个选项不起作用,因为Pydelay仅支持生成每个样本独立于其他样本的噪声,而粉红噪声则不然。

有人知道怎么做吗?

这是我的代码(我需要I1和I2是粉红色的噪音,而不是像我的代码那样不变):

# -*- coding: utf-8 -*-
"""
Created on Tue Aug  2 15:35:15 2016

@author: kasienka
"""
#!python
import pydelay
from time import time
import math
import numpy as np
from numpy import fft
from scipy import integrate
import matplotlib as mpl
mpl.use('Agg')
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from scipy.interpolate import griddata
import sys
import pylab as pl
from pydelay import dde23

# define the equations
eqns = {
    'y1' : 'I1 - y1(t-tau) + epsilon * pow(y2(t-tau), 1.1)',
    'y2' : 'I2 - y2(t-tau) + epsilon * pow(y1(t-tau), 1.1)'
    }
#define the parameters
params = {
    'I2' : 0.2,
    'I1' : 0.4,
    'tau': 1.31,
    'epsilon': 0.2
    }

# Initialise the solver
dde = dde23(eqns=eqns, params=params)

# set the simulation parameters
dde.set_sim_params(tfinal=50, dtmax=0.0001)

histdic = {
    'y1': lambda t: 0.2,
    'y2': lambda t: 0.4
    }
dde.hist_from_funcs(histdic, 1000)

# run the simulator
dde.run()
p1 = []
p2 = []
x1 = []
x2 = []
czasy = np.linspace(0, 50, 10000)
for el in times:
    x10 = dde.sol_spl(el)['y1']
    x20 = dde.sol_spl(el)['y2']
    prob1 = 1.0 / (1 + 3.14**(-(x10 - x20)) )
    prob2 = 1.0 / (1 + 3.14**(-(x20 - x10)) )
    p1.append(prob1)
    p2.append(prob2)
    x1.append(x10)
    x2.append(x20)
fig = pl.figure()
pl.plot(times, p1, label = '$p_1$')
pl.plot(times, p2, label = '$p_2$')
pl.xlabel('$time$')
pl.ylabel('$probabilities$')
pl.legend()
pl.savefig(sys.argv[1])

2 个答案:

答案 0 :(得分:1)

我认为你想要动态噪音¹。在这种情况下,您应该首先意识到有几种类型的微分方程具有根本不同的求解器:

  • 延迟微分方程(DDE)通常用以下任一方法解决:

    • 嵌入式多步Runge-Kutta方法,其中插入过去(这是Pydelay所做的),

    • 单步积分器,集成步骤划分所有延迟。

  • 随机微分方程(SDE)用简单的单步法求解(均基于欧拉方法)。多步骤方法仍然是一个热门话题,嵌入式方法最近才被提出。

    我所知道的关于SDE的所有论文(理论和方法;然而它们并不是那么多),只考虑白噪声(Wiener过程);实现粉红噪声本身就是一个问题。我通过快速搜索找到的所有内容都是a paper on simulating white noise with a white-noise SDE

  • 随机延迟微分方程(SDDEs)再次需要特殊求解器。我对它们不是很熟悉,但显然你至少继承了DDE和SDE的所有限制。因此,最好的求解器将是一步法,其中积分步骤划分所有延迟。通过快速浏览文献,这确实是做了什么。请注意,这并不能解决粉红噪音问题。

如前所述,Pydelay使用多步法进行插值。这不适用于并且无法正确处理随机性(如果是,它将成为SDE的显着解算器,即没有延迟)。相反,它所做的是将多步骤方法视为单步方法并在之后添加噪声。正如Pydelay的作者所说,这“非常粗糙”。此外,实际上使用粉红噪声(即使使用粗略方法)也需要重新编程软件,并可能导致积分器误差估计的固有问题。我强烈建议不要这样做。即使你成功了,使用高级DDE求解器的所有优点(例如,自适应步骤)也会丢失,所以从头开始编写一个新的,更简单的积分器会更容易。

如果你真的需要这样做,我建议先找出如何用粉红噪声解决SDE,然后将方法扩展到SDDE(希望这很简单)。

¹如果您想观察噪音,那很简单:只需将其添加到您的解决方案中。

答案 1 :(得分:0)

所以问题是为数据集中的所有元素生成粉红噪声?

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

来源:ThinkDSP