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(...))
即可。
我正在使用 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(...))
即可。