我有以下ODE:
其中p
是概率,而y
是pdf随机变量:
epsilon
是一个较小的临界值(通常为0.0001)。
我正在寻找在Python
中以数字方式求解该系统,使t = 0
大约为500
。
有没有一种方法可以使用numpy/scipy
来实现?
答案 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)
但是,您必须提供自己的randfunc
。像上面一样,它应该是一个以x
和t
作为参数并从随机变量y
返回单个样本的函数。如果您在想出一种生成y
样本的方法时遇到麻烦,则由于您知道PDF
,因此可以始终使用rejection sampling(尽管它的效率很低)。
np.random.rand(500)
)。但是,由于y
取决于p
,因此您无法预先生成随机样本。