Python 使用自定义pdf解决带有随机变量的ODE
我有以下建议: 其中,Python 使用自定义pdf解决带有随机变量的ODE,python,numpy,scipy,Python,Numpy,Scipy,我有以下建议: 其中,p是一个概率,y是一个带有pdf的随机变量: epsilon是一个小的截止值(通常为0.0001) 我希望用Python对这个系统进行数值求解,从t=0到大约500 是否有一种方法可以使用numpy/scipy实现此功能 SDE集成缺乏高质量的Python包,这令人恼火。你有一种不寻常的设置,因为你的随机变量明显依赖于你的被积函数(至少看起来y依赖于p)。因此,可能很难找到满足您需求的现有实现 幸运的是,SDE集成的最简单方法非常容易实现,如下面的eulmar函数: f
p
是一个概率,y
是一个带有pdf的随机变量:
epsilon
是一个小的截止值(通常为0.0001)
我希望用Python
对这个系统进行数值求解,从t=0
到大约500
是否有一种方法可以使用
numpy/scipy
实现此功能 SDE集成缺乏高质量的Python包,这令人恼火。你有一种不寻常的设置,因为你的随机变量明显依赖于你的被积函数(至少看起来y
依赖于p
)。因此,可能很难找到满足您需求的现有实现
幸运的是,SDE集成的最简单方法非常容易实现,如下面的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
,你总是可以使用它(尽管它往往效率很低)
笔记
- 这不是Euler Maruyama的一个特别有效的实现。例如,随机样本通常一次生成(例如
)。但是,您不能预先生成随机样本,因为np.random.rand(500)
取决于y
p