2017-01-13 9 views
1

Мне нужно решить набор дифференциальных уравнений задержки, и я хочу использовать розовый шум в этих уравнениях.Задержка дифференциальных уравнений с розовым шумом

Я попытался сделать это с пакетом Pydelay для Python, но проблема в том, что мне нужно либо генерировать шум, а затем передавать его в симуляцию или генерировать шум во время моделирования. Первый вариант не работает, потому что параметры, указанные в этом решателе, должны быть постоянными, и со временем изменяется шум. Второй вариант не работает, потому что 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]) 
+0

Как вы думаете, добавление рабочего кода поможет описать проблему? – periphreal

+0

Так возникает проблема генерации * розового шума *? –

ответ

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

1

Я предполагаю, что вы хотите динамическую noise¹. В этом случае, вы должны сначала понять, что существует несколько типов дифференциальных уравнений с принципиально различными решателями:

  • задержка дифференциальных уравнений (DDEs), как правило, решаются либо:

    • встроенными , многоступенчатые методы Рунге-Кутта, в которых прошлое интерполировано (это то, что делает Pydelay),

    • одноступенчатые интеграторы с шагом интеграции, разделяющим все задержки ,

  • стохастические дифференциальные уравнения (СДУ) решаются с помощью простых методов одноступенчатых (все они основаны на методе Эйлера). Многоступенчатые методы по-прежнему являются горячей темой, а встроенные методы были предложены совсем недавно.

    Все трактаты по SDE Я знаю (теоретические и методы, однако они не так уж много признаются), учитывайте только белый шум (процесс Винера); осознание розового шума - проблема сама по себе. Все, что я мог найти с быстрым поиском, было a paper on simulating white noise with a white-noise SDE.

  • Стохастические дифференциальные уравнения задержки (SDDE) также нуждаются в специальных решателях. Я не очень хорошо знаком с ними, но, очевидно, вы, по крайней мере, наследуете все ограничения DDE и SDE. Следовательно, лучшим решателем будет одношаговый метод с шагом интеграции, делящим все задержки. Просматривая литературу, это действительно то, что делается. Имейте в виду, что это не затрагивает проблему розового шума.

Как уже говорилось, Pydelay использует многошаговый метод с интерполяцией. Это не предназначено и неспособно должным образом справляться со стохастичностью (если бы это было так, это было бы замечательным решателем для SDE уже, т. Е. Без задержки). Вместо этого он обрабатывает многошаговый метод как одноэтапный метод и добавляет шум впоследствии.Как отмечают авторы Пиделя, это «совсем грубо». Более того, на самом деле использование розового шума (даже с грубым методом) потребует от вас перепрограммировать программное обеспечение и может привести к присущим проблемам с оценкой ошибок интегратора. Я настоятельно рекомендую против этого. Даже если вам это удастся, все преимущества использования продвинутого решателя DDE (например, адаптивных шагов) все равно теряются, поэтому проще написать новый, более простой интегратор с нуля.

Если вам действительно нужно это сделать, я рекомендую сначала выяснить, как разрешить SDE с розовым шумом, а затем расширить метод до SDDE (который, мы надеемся, довольно прост).


¹ Если вы хотите иметь наблюдательный шум, это легко: Просто добавьте его к вашему решению.