使用mpmath函数执行scipy.integrate的四元积分方法时出现“TypeError”消息

时间:2017-11-20 20:38:54

标签: scipy integration integral quad mpmath

我正在尝试使用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.定义的积分不兼容

1 个答案:

答案 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进行缩放和作为上限,但这是另一个故事。