Python:使用scipy quad将积分和函子嵌套在另一个积分中

时间:2018-07-29 21:11:10

标签: python scipy probability numeric stochastic-process

我已经使用scipy.integrate.quad为随机过程类编写了几行代码

我具有用于标准布朗运动的马尔可夫跃迁函数

import numpy as np
def p(x,t):
    return (1/np.sqrt(2*np.pi*t))*np.exp(-x**2/(2*t))

但是我想计算以下内容,这些内容我将用无法正常工作的代码编写。我这样写是为了不使用乳胶就可以理解问题。

 from scipy.integrate import quad
 integral = quad(quad(p(y-x),1,np.inf)*p(x,1),1,np.inf) 

您可能已经注意到问题是内部积分中发生的二元变量。我做了以下事情,但不确定:

p_xy = lambda y,x: p(y-x,1)
inner = lambda x : quad(p_xy,1,np.inf,args = (x,))[0]
outer = lambda x: inner(x)*p(x,1)
integral = quad(outer,1,np.inf)[0]

然后我得到

 0.10806767286289147

我喜欢Python及其lambda函数,但似乎对此不确定。你怎么看?谢谢您的宝贵时间。

1 个答案:

答案 0 :(得分:0)

对于您希望执行的积分类型(双变量积分),SciPy具有dedicated routines

优点是这些例程更容易处理复杂边界(例如,边界取决于另一个坐标)。

我将您的示例重写为:

import numpy as np
from scipy.integrate import nquad

def p(x,t):
    return (1/np.sqrt(2*np.pi*t))*np.exp(-x**2/(2*t))

def integrand(x, y):
    return p(y-x, 1)*p(x, 1)

integral = nquad(integrand, ((1, np.inf), (1, np.inf)))

print(integral[0])

打印出相同的结果。我相信上面的代码更容易阅读,因为将被整数明确地编写为两个变量的函数。