使用自定义pdf

时间:2018-11-24 17:53:37

标签: python numpy scipy

我有以下ODE:

ODE

其中p是概率,而y是pdf随机变量:

see link

epsilon是一个较小的临界值(通常为0.0001)。

我正在寻找在Python中以数字方式求解该系统,使t = 0大约为500

有没有一种方法可以使用numpy/scipy来实现?

1 个答案:

答案 0 :(得分:0)

令人烦恼的是,缺乏用于SDE集成的高质量Python软件包。您有一种不寻常的设置,因为您的随机变量对您的被积数有明确的依赖性(至少看来y取决于p)。因此,可能很难找到满足您需求的现有实现。

幸运的是,最简单的SDE集成方法Euler-Maruyama很容易实现,就像下面的eulmar函数一样:

from matplotlib import pyplot as plt
import numpy as np

def eulmar(func, randfunc, x0, tinit, tfinal, dt):
    times = np.arange(tinit, tfinal + dt, dt)
    x = np.zeros(times.size, dtype=float)
    x[0] = x0

    for i,t in enumerate(times[1:]):
        x[i+1] = x[i] + func(x[i], t) + randfunc(x[i], t)

    return times, x

然后您可以使用eulmar来集成SDE,如下所示:

def func(x, t):
    return 1 - 2*x

def randfunc(x, t):
    return np.random.rand()

times,x = eulmar(func, randfunc, 0, 0, 500, 5)
plt.plot(times, x)

enter image description here

但是,您必须提供自己的randfunc。像上面一样,它应该是一个以xt作为参数并从随机变量y返回单个样本的函数。如果您在想出一种生成y样本的方法时遇到麻烦,则由于您知道PDF,因此可以始终使用rejection sampling(尽管它的效率很低)。

注释

  • 这不是Euler-Maruyama的特别有效的实现。例如,随机样本通常一次全部生成(例如np.random.rand(500))。但是,由于y取决于p,因此您无法预先生成随机样本。