我有一个功能:
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`
我从来没有真正了解过
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 是我的一个项目。)