scipy Python中的E1/3函数

4ngedf3f  于 8个月前  发布在  Python
关注(0)|答案(2)|浏览(117)

我正在用Python分析一些实验结果,我需要将数据拟合到一个包含广义指数积分E1/3的分布。除了自己计算积分(非常慢)之外,我能找到的最接近的方法是scipy.special.expn(n, x),但它只支持n的整数值,我需要n=1/3
有人知道这样的功能是否存在吗?

insrf1ej

insrf1ej1#

更新

如果使用正交例程编写自己的程序不够准确,您可以考虑使用sympy。该函数在sympy.functions.special.error_functions.expint中实现。因为你想要一个数值解,你需要把它转换成一个浮点数。

import sympy as sp

def expn(n, x):
    return float(sp.functions.special.error_functions.expint(n, x))

print(expn(1/3,1))  # 0.3044294477841587

它不快,但它可能会做你想要的。
编辑:另一种选择是使用基于上不完全伽马函数的指数积分的定义(scipy对此有一个归一化函数),根据数学函数的数字库。

from scipy.special import gammaincc, gamma

def expn(n, x):
    return x**(n-1)*gammaincc(1-n,x)*gamma(1-n)

print(expn(1/3, 1)) # 0.3044294477841586

旧方案

奥萨马使用正交的解决方案不够通用,所以我在下面包括我自己的版本。

from scipy.integrate import quad
import numpy as np

def expn(n, x):
    return quad(lambda t: np.exp(-x*t)/t**n, 1, np.inf)[0]

print(expn(1/3,1))  # 0.3044294477840883

在精度方面,Mathematica报告结果为0.30442944778415870046。因此,上述正交解具有2.312e-11%的误差。我无法想象一个更高精度的解决方案将是必要的。

w1jd8yoj

w1jd8yoj2#

我认为你需要定义函数来计算这个,

import numpy as np
from scipy.integrate import quad

def integrand(x):
    return np.exp(-x) / x**(1/3)

result, error = quad(integrand, 0, np.inf)
print(result)

但它适用于学术用途,我的导师推荐了一个python库“mpmath”ref:offical mpmath website,比上面的函数快得多。所以修改后的snippet将是这样的:

import mpmath

def integrand(x):
    return mpmath.exp(-x) / x**(1/3)

result = mpmath.quad(integrand, [0, mpmath.inf])
print(result)

相关问题