首页 > 解决方案 > 具有复杂积分界限的 Python scipy.integrate.quad

问题描述

我正在使用 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 文档中定义的一维积分。我想myfun使用 scipy 的quad函数来比较这个结果:

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

但是,我不认为quad接受关于积分上限/下限的复杂论点。我不知道是否可以将问题分成实部/虚部。有任何想法吗?

标签: pythonscipycomplex-numbersmpmath

解决方案


积分应该a在从右到右的水平半线上。(如果a是负实数,这将失败,但无论如何这是一个分支切割区域)。该半线由a+tt 为实数并从 0 到无穷大进行参数化。因此,从 0 积分exp(-(a+t))/(a+t)到无穷大。

此外,quadSciPy 需要实值函数,因此将其分为实部和虚部。并且不要忘记该函数必须作为可调用对象传递,例如 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(...))可以。


推荐阅读