Python 函数返回numpy数组时的scipy.integrate.quad
我有一个函数返回我需要集成的numpy数组。我想使用Python 函数返回numpy数组时的scipy.integrate.quad,python,numpy,scipy,Python,Numpy,Scipy,我有一个函数返回我需要集成的numpy数组。我想使用scipy.integrate.dblquad,但它需要函数返回浮点值 我试图在dblquad上使用numpy.vectorize,但它不起作用。经过一番思考,我意识到这种方法的问题在于,向量化的dblquad需要函数向量,而不是返回向量的函数 我想用任何方法来解决这个问题,除了拆分数组和逐案集成(已经这样做了,代码一团糟)。我想到的第一件事是将返回数组的函数转换为返回等价函数的数组,但我不知道这是否可行 我会放一些说明性的代码。下面,x和y是
scipy.integrate.dblquad
,但它需要函数返回浮点值
我试图在dblquad
上使用numpy.vectorize
,但它不起作用。经过一番思考,我意识到这种方法的问题在于,向量化的dblquad
需要函数向量,而不是返回向量的函数
我想用任何方法来解决这个问题,除了拆分数组和逐案集成(已经这样做了,代码一团糟)。我想到的第一件事是将返回数组的函数转换为返回等价函数的数组,但我不知道这是否可行
我会放一些说明性的代码。下面,x
和y
是numpy数组,a
和b是浮点数
我想做什么
x = np.random.rand((3,3))
y = np.random.rand((3,3))
a = 1.5
b = 3.0
I = dblquad(foo, 0, 1, lambda x: 0, lambda x: 1, args=(x,y))
获取一个数组I
,其形状(3,3)
,其条目I[I][j]
为foo(a,b,x[i][j],y[i][j])
,前两个参数超过0和1
我相信有一种聪明的方法可以用
np.vectorize
,但我想不出任何方法。这对我来说很有用:
f = lambda x,y,a,b: np.exp(a*x+b*y)
dblquad(f, 0, 1, lambda x:0, lambda x:1, args=(1.0,1.0), epsabs=1.49e-08, epsrel=1.49e-08)
f-2D函数,x,y为变量a,b-仅为参数。所以我们在dblquad函数中将x从0积分到1秒和第三个arg,然后在dblquad函数中将y从0积分到第四个arg和第五个arg,但是以函数的形式;然后以args=(1.0,1.0)的形式传递a,b。剩下的是默认的东西
如果要在某些值范围内改变参数,可以执行以下操作:
[dblquad(f, 0, 1, lambda x:0, lambda x:1, args=(a,b)) for a in range(2) for b in range(2)]
这将得到一个平面数组,其结果(积分)对应于(a,b):
您还可以执行以下操作:
[[dblquad(f, 0, 1, lambda x:0, lambda x:1, args=(a,b)) for a in range(2)] for b in range(2)]
这将产生对应于(a,b)的2D结构化结果列表:
我的意思是x和y作为数组,所以foo值也是一个数组。用x=np.ones((2,2))和y=np.ones((2,2))试试你的建议。这样四元函数就不起作用了,这就是我想要的。你是对x,y还是a,b进行积分?[dblquad(f,0,1,lambda x:0,lambda x:1,args=(a,b)),用于范围(2)中的a,用于范围(2)中的b]-列出改变参数的共同理解。。。这不是你想要的吗?积分是在a和b之上的。x和y是数组。f=lambda,b,x,y:np.exp(ax+by);[dblquad(f,0,1,lambda var:0,lambda var:1,args=(x,y))用于np.arange(3)中的x]
[(0, 0), (0, 1), (1, 0), (1, 1)]
[[dblquad(f, 0, 1, lambda x:0, lambda x:1, args=(a,b)) for a in range(2)] for b in range(2)]
[[(0, 0), (0, 1)], [(1, 0), (1, 1)]]