Python的scipy.integrate.quad具有复杂的集成范围

时间:2018-08-08 12:26:23

标签: python scipy complex-numbers mpmath

我正在使用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接受复杂的参数作为积分的上限/下限。我不知道是否可以将问题分解为真实/虚构的部分。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

积分应在从IF+IF(+6)+IF(+6)到右侧的水平半线上进行。 (如果a为负实数,则此操作将失败,但无论如何这都是分支切入区域)。该半线由a参数化,其中t为实数,从0到无穷大。因此,将a+t从0集成到无穷大。

此外,SciPy的exp(-(a+t))/(a+t)需要使用实值函数,因此请将其分为实部和虚部。并且不要忘记该函数必须作为可调用函数传递,例如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

顺便说一句,如果您只想转换一个数字,则无需将myfun包装到数组中:array([ 0.34111201-0.36240972j]) 可以。