0

我正在尝试使用计算两个积分scipy.integrate.quad.但是,由于第一个参数为负的gamma函数未在 中定义,我必须从 中选择版本。运行以下代码后,scipympmath

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)

这是我不知道如何处理并需要帮助的错误消息:

回溯(最后一次调用):文件“test.py”,第 19 行,在 Integral1 = quad(Integrand1, low, threshold, args=(low, up, threshold, alpha, beta)) 文件“/home/username/ anaconda3/lib/python3.6/site-packages/mpmath/calculus/quadrature.py”,第 748 行,四点 [0],prec,epsilon,m,详细)文件“/home/username/anaconda3/lib/ python3.6/site-packages/mpmath/calculus/quadrature.py",第 215 行,对于 i in xrange(len(points)-1) 的总和:TypeError:'float' 类型的对象没有 len()

我只能猜测原因可能是quad函数与使用定义的积分不兼容mpmath.

4

1 回答 1

1

导入语句

不要从两个地方导入 *,这是名称冲突的秘诀。MpMath 有它自己的quad方法,它取代quad了您代码中的 SciPy。

from scipy.integrate import quad
from mpmath import gamma, gammainc 

功能参数

如果您正在调用 function 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 函数的参数与它们期望接收的参数相匹配。args他们得到 x,以及quad 参数中列出的所有内容。

上面的代码不会引发任何错误。我不确定该操作在数学上是否有意义,因为您threshold同时使用缩放和上限,但这是另一回事。

于 2017-11-20T20:50:24.843 回答