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