代码之家  ›  专栏  ›  技术社区  ›  Medulla Oblongata

python的scipy.integrate.quad具有复杂的集成边界

  •  1
  • Medulla Oblongata  · 技术社区  · 6 年前

    我正在用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 使用ScPy的 quad 功能:

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

    但是我不认为 方庭 接受集成的上/下限的复杂参数。我不知道是否可以把问题分成实部/虚部。有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  4
  •   user6655984    6 年前

    积分应该在水平半直线上 a 向右。(如果 是一个负实数,但无论如何,这是一个分支切割区域)。此半直线由参数化 a+t 其中t是实的,从0到无穷大。所以,整合 exp(-(a+t))/(a+t) 从0到无穷大。

    也, quad 从scipy需要实值函数,所以把它分成实部和虚部。别忘了函数必须作为可调用函数传递,比如 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(...)) 会的。