2017-06-03 37 views
0

我想做类似于this question的操作。集成一个返回矩阵numpy的函数

Nm, Mm = np.meshgrid(range(3), range(2)) 
y = lambda x: x*Nm + x*Mm 

然后,y返回3x2矩阵。我想将y从a整合到b,例如我们可以选择a = 0和b = 1。这意味着积分矩阵的i,j分量应该是(x * i + x * j)dx的0到1的整数。如果我考虑到其中一个答案:

>>> a = [sin, cos] 
>>> vectorize(quad)(a, 0, pi) 

显然a是功能列表,但是我有什么是返回一个数组,这是不同的函数。我得到:

res = np.vectorize(integrate.quad)(y, 0, 1) 

error: Supplied function does not return a valid float. 

我该如何解决这个问题?感谢您的帮助

编辑:

期望的结果是

res = np.empty((3,2)) 
for i in range(3): 
    for j in range(2): 
     res[i, j] = quad(lambda x: x*i + x*j, 0, 1)[0] 
+0

因此,所期望的结果与'quad'有6次不同的'i'和'j'值吗?参考向我们展示如何用显式循环来做到这一点。 – hpaulj

+0

是@hpaulj这是所需的结果。 –

回答

2

通过一个lambda传递i,j另一种方法是使用args参数的quad

In [39]: def foo(x,i,j): 
    ...:  return x*i + x*j 
In [40]: i,j=1,2 
In [41]: integrate.quad(lambda x: x*i+x*j, 0,1) 
Out[41]: (1.5, 1.6653345369377348e-14) 
In [42]: integrate.quad(foo, 0, 1, args=(i,j)) 
Out[42]: (1.5, 1.6653345369377348e-14) 

这仍然分别评估每对i,j对的功能。

您或许可以将i,j迭代掩埋在np.vectorize函数中,但这不会提高速度。只有在您需要广播帮助时,我才会提倡。

一个类似的问题定期出现。人们希望对一系列功能或参数应用quad(或其他scipy函数)。但是,假设你想给集成步骤等提供全面的权力,那么迭代是不可替代的。

1

你想就可以实现这种方式是什么:

Nm, Mm = np.meshgrid(range(3), range(2)) 

def f(m,n): 
    def g(x): 
     return m*x+n*x 
    return g 

fv=np.vectorize(f) 

u=fv(Mm,Nm) 

np.vectorize(quad)(u,0,1) 

但没有numpy的加速度将出现在这里。它只是一种模仿裸体裸体风格的商品。

相关问题