scipy.integrate.quad 有没有办法接受 args 中的数组?

问题描述 投票:0回答:1

我有一个功能:

def xx(th, T, B):
    f = integrate.quad(xint, 0, np.inf, args = (th, T, B))[0]
    a = v(th)*f
    return a

其中

xint
p, th, T, B
的函数的函数。上述所有功能均运行良好;然后,
xx(th, T, B)
应该在
th
上积分,其他变量是单个数字。

当我运行这个时,我得到:

TypeError: only size-1 arrays can be converted to Python scalars
,因为
th
是一个数组而不是单个数字。

我尝试过使用 lambda 函数以及

dblquad
在同一计算中执行两个积分,但没有任何效果。牢记这些限制,从而试图避免 for 循环,有没有办法让
integrate.quad
接受数组参数?

运行时回溯:

run file.py
  Traceback (most recent call last):

  File "file.py", line 280, in <module>
  file()

  File "file.py", line 240, in sctif
  axes[0, 2].plot(th, xx(th,10, 10))

  File "file.py", line 166, in xx
  f, _ = integrate.quad(xint, 0, 100,args = (th,T,B))

  File "/home/caitlin/anaconda3/lib/python3.7/site-packages/scipy/integrate/quadpack.py", line 352, in quad
points)

  File "/home/caitlin/anaconda3/lib/python3.7/site-packages/scipy/integrate/quadpack.py", line 463, in _quad
return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)

TypeError: only size-1 arrays can be converted to Python scalars`

  
python numpy scipy numerical-integration
1个回答
0
投票

我从来没有真正了解过

args
选项的用处。恕我直言,如果您定义一个仅接受一个参数的函数(也许通过包装),代码会变得更清晰:

th = 2.0
T = 1.0
B = 3.0

def xint(x):
    return th * x ** B / T

f, _ = integrate.quad(xint, 0, np.inf)

现在,如果

th
T
B
之一是向量,则您的函数是向量值的,并且您不能再使用
quad
。我会研究
quad_vec
quadpy.quad
。 (quadpy 是我的一个项目。)

© www.soinside.com 2019 - 2024. All rights reserved.