我正在处理一个超简化的辐射传输问题,我最终得到了一个形式的积分
\ int_ {x_0} ^ {x_1} e ^ {+ t} t ^ a dt
在我的一个方程式中。是否有:
1.这个功能的特殊名称,我还没有找到?它与不完整的伽玛函数明显相关
\ frac {1} {\ Gamma(a)} \ int_0 ^ {x} e ^ { - t} t ^ {a-1} dt
这是在scipy.special.gammainc
下实施的。我已经在我的代码的早期部分中使用了它
2.这种函数的合理快速实现,其中指数$ a $是固定的但是积分边界$ x_ {0,1} $是可变的吗?优选地,$ x_ {0,1} $可以是相同长度的numpy向量,或者其中一个是标量? (如果能澄清问题,我可以讨论如何解决这个问题。)
两种简单的解决方法是使用scipy.integrate.quad
或scipy.integrate.cumtrapz
:
from scipy.integrate import quad
from scipy.integrate import cumtrapz
from numpy import exp, empty_like, linspace, ones
a = 0.286 * 4.0
fIntegrand = lambda t: exp(t) * t**a
def FIntegrated1(x0,x1):
# Use quad to do integrals one by one
F = empty_like(x0)
for i in xrange(x0.size):
F[i] = quad(fIntegrand, x0[i], x1[i])[0]
return F
def FIntegrated2(x):
# Use cumtrapz
# x is a numpy array from x0 to maximum x1 to be calculated
F = cumtrapz(fIntegrand, x=x, initial=0.0)
return F
# Test out with typical values
x = linspace(.5,8,50)
x1 = x[1:]
x0 = ones(x1.shape) * .5
F1 = FIntegrated1(x0,x1)
F2 = FIntegrated2(x)
两种解决办法都不是特别慢或特别快,但更好的方法会受到赞赏。