python - 具有复杂积分界限的 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
接受关于积分上限/下限的复杂论点。我不知道是否可以将问题分成实部/虚部。有任何想法吗?
解决方案
积分应该a
在从右到右的水平半线上。(如果a
是负实数,这将失败,但无论如何这是一个分支切割区域)。该半线由a+t
t 为实数并从 0 到无穷大进行参数化。因此,从 0 积分exp(-(a+t))/(a+t)
到无穷大。
此外,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(...))
可以。
推荐阅读
- c++ - 关于在 lambda 中传递引用的值传递问题
- terraform - 未找到 Terraform Sentinel 策略资源
- sql - 为什么我会收到这么多对我查询不多的表的 SQL 调用?
- java - 遇到错误 Attempt to invoke virtual method 'RecyclerView.setAdapter(RecyclerView$Adapter)' on an null object reference in Android Studio
- firebase-authentication - google.auth.GoogleAuth() 需要什么 keyFile 密钥?
- python - 循环遍历列表以查找另一个列表的匹配项
- python - 如何使用 Pandas 用定义的规则填充一些单元格?
- python - Flask - 避免在控制器中有代码
- ruby-on-rails - with_pg_search_highlight 与关联字段
- javascript - 在javascript中显示数组列表中的信息