Python 的 scipy.integrate.quad 具有复杂的积分界限

Python's scipy.integrate.quad with complex integration bounds

我正在使用 Python 的 mpmath.gammainc:

计算上不完全伽马函数
import numpy as np
from mpmath import gammainc    

z = 0 # define power of t as t^(-1)
a = 0.5+0.4j # integral lower limit
b = np.inf # integral upper limit

myfun = np.array([gammainc(z,a,b,regularized=False)], dtype=complex)      

它是 mpmath 文档中定义的一维积分。我想使用 scipy 的 quad 函数比较此结果 myfun

myfun2 = scipy.integrate.quad(exp(-t)/t, a, inf)[0]

但是我认为 quad 不接受关于 upper/lower 积分界限的复杂参数。我不知道是否可以将问题分成 real/imaginary 个部分。有什么想法吗?

积分应取自 a 向右的水平半线。 (如果 a 是一个负实数,这将失败,但无论如何这是一个分支切割区域)。这条半线由 a+t 参数化,其中 t 是实数,从 0 到无穷大。所以,对 exp(-(a+t))/(a+t) 从 0 到无穷大进行积分。

此外,SciPy中的quad需要实值函数,因此将其分为实部和虚部。并且不要忘记该函数必须作为可调用对象传递,例如 lambda t: np.exp(-t),而不仅仅是 exp(-t)

from scipy import integrate
myfun2_re = integrate.quad(lambda t: np.real(np.exp(-(a+t))/(a+t)), 0, np.inf)[0]
myfun2_im = integrate.quad(lambda t: np.imag(np.exp(-(a+t))/(a+t)), 0, np.inf)[0]
myfun2 = myfun2_re + 1j*myfun2_im
print(myfun2)

这会打印

(0.3411120086192922-0.36240971724285814j)

myfun相比,

array([ 0.34111201-0.36240972j])

顺便说一下,如果您只想转换一个数字,则无需将 myfun 包装到数组中:complex(gammainc(...)) 即可。