我正在尝试使用 Mathematica 和 Python 中的数值积分函数直接评估这个积分。
在哪里是下不完全 Gamma 函数。在我的实际问题中可以取 10 到 100 之间的值,其中 可以取 100 到 1000 之间的值。
这是Python代码
import numpy as np
import scipy.integrate as integrate
import scipy.special as special
def integrand(a,b,y):
l=len(a)
x=pow(y,-(l+1))
for ai,bi in zip(a,b):
# x*=special.gammainc(ai+1,bi*y)
x*=1/bi*special.gammainc(ai+1,bi*y)
return x
ns=[2,4,5,6]
print integrate.quad(lambda x: integrand([n for n in ns],[0.1,0.8,0.3,0.4],x),0,np.inf)
print integrate.quad(lambda x: integrand([10*n for n in ns],[0.1,0.8,0.3,0.4],x),0,np.inf)
print integrate.quad(lambda x: integrand([100*n for n in ns],[0.1,0.8,0.3,0.4],x),0,np.inf)
相应的输出是
考虑到谦虚,这令人失望=4。在第二个输出中~并且误差比得到的积分大一个数量级。不需要评论第三个审判案例~,零错误!
当然这不是魔术,我使用的是完整的积分区间,并要求数字技巧,如减少积分间隔和任何其他处理以获得合理的结果。
我通过乘以一个常数() 并且数字在我的应用程序的所有范围内变得更加稳定。
例如,通过绘制被积函数,我看到了一条跨越范围的单峰曲线,和分别消失在外面。如果我分别截断积分区间,结果是完全可以接受的,并且与 Wolfram Mathematica 的结果一致。我尝试了其他更大的集合,并通过试验/错误找到间隔。所以如果我能找到合适的间隔,我会很高兴。
我怎样才能找到任何组的间隔和和一个使数字稳定的乘法常数?