我正在尝试使用scipy.integrate.quad.
计算两个积分但是,由于 gamma 函数负第一个参数未在scipy
中定义,我必须从mpmath
中选择版本。运行以下代码后,
from scipy.integrate import *
from mpmath import *
low, up = 5.630e5, 1.167e12
alpha, threshold = 1.05 , 2.15e10
beta = 274
def g(x, beta, low, up):
return gamma(-2/3) * (gammainc(-2/3, beta*(x/low)**3) - gammainc(-2/3, beta*(x/up)**3))
def Integrand1(x, low, threshold, alpha):
return pow(x/threshold, alpha) * g
def Integrand2(x, up, threshold):
return g
Integral1 = quad(Integrand1, low, threshold, args=(low, up, threshold, alpha, beta))
Integral2 = quad(Integrand2, threshold, up, args=(low, up, threshold, beta))
print(Integral1)
print(Integral2)
以下是错误消息,我不知道如何处理并需要帮助:
Traceback(最近一次调用最后一次):文件“test.py”,第19行,in Integral1 = quad(Integrand1,low,threshold,args =(low,up,threshold,alpha,beta))文件 “/home/username/anaconda3/lib/python3.6/site-packages/mpmath/calculus/quadrature.py” 第748行,四边形 points [0],prec,epsilon,m,verbose)文件“/home/username/anaconda3/lib/python3.6/site-packages/mpmath/calculus/quadrature.py”, 第215行,总结 for x in xrange(len(points)-1):TypeError:'float'类型的对象没有len()
我只能猜测原因可能是quad
函数与使用mpmath.
定义的积分不兼容
答案 0 :(得分:1)
不要从两个地方导入*,这是名称冲突的秘诀。 MpMath有自己的quad
方法,它可以替代代码中的SciPy quad
。
from scipy.integrate import quad
from mpmath import gamma, gammainc
如果您正在调用函数g
,则必须为其提供参数。因此,请写下* g(x, beta, low, up)
而不是* g
。
当然,这些参数也必须可用于调用g
的函数。像这样:
def Integrand1(x, low, up, threshold, alpha, beta):
return pow(x/threshold, alpha) * g(x, beta, low, up)
def Integrand2(x, low, up, threshold, alpha, beta):
return g(x, beta, low, up)
Integral1 = quad(Integrand1, low, threshold, args=(low, up, threshold, alpha, beta))
Integral2 = quad(Integrand2, threshold, up, args=(low, up, threshold, alpha, beta))
请注意,传递给Integrand函数的参数与它们期望接收的参数相匹配。它们得到x,并且在args
参数中列出了所有内容。
上面的代码没有抛出任何错误。我不确定该操作在数学上是否有意义,因为您使用threshold
进行缩放和作为上限,但这是另一个故事。