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

一个简单的谷歌搜索会引导你。@MaJoR:无法解决问题。@WarrenWeckesser,对不起,但当我评论这一点时,OP没有提到他想解决的DEs类型。他只是脱口而出颂歌。对于一般性问题,我留下了一般性的评论。