【发布时间】:2019-02-20 06:55:51
【问题描述】:
我需要执行二维积分(一维有无限界限)。在 MatLab 中,我用积分 2 完成了它:
int_x = integral2(fun, 0, inf, 0, a, 'abstol', 0, 'reltol', 1e-6);
在 Python 中,我尝试过 scipy 的 dblquad:
int_x = scipy.integrate.dblquad(fun, 0, numpy.inf, lambda x: 0, lambda x: a, epsabs=0, epsrel=1e-6)
并且还尝试过使用嵌套的单四边形。不幸的是,这两个 scipy 选项都比 MatLab 的要长约 80 倍。
我的问题是:在 Python 中是否有不同的 2D 积分实现可能更快(我试过“quadpy”但没有太多好处)?或者,我是否可以编译 MatLab 的积分 2 函数并从 python 调用它而不需要 MatLab 运行时(甚至是犹太教)?
提前致谢! 布拉德
更新:
原来我没有“声誉”来发布方程的图像,所以请忍受格式:fun(N,t) = P(N) N^2 S(N,t) ,其中 P(N) 是对数正态概率分布,S(N,t) 是相当复杂的,但其最简单形式是指数函数,最复杂形式是超几何函数(截断序列)。 N 从 0 积分到无穷大, t 从 0 积分到 pi。
【问题讨论】:
-
积分有 2 个大时间变量,
fun必须被计算的次数,以及每次计算fun需要多长时间。一个“智能”集成器可以最大限度地减少fun调用的数量(这对于infbound). But I suspect MATLAB is getting most of its speed from some sort ofjit` 编译fun可能很重要。numpy/scipy没有做这样的事情。但是你没有没有告诉我们任何关于fun的事情。 -
有趣,谢谢@hpaulj。有关“乐趣”的更多但仍然有限的详细信息,请参见上文。你认为我最好的选择是考虑 jit-ting '有趣'(不确定它是如何工作的)。
-
关于 jit 编译:这可以在 Python 中使用 Numba 完成。
-
您是否考虑过使用梯形规则 (
np.trapz) 等非自适应积分方案?在许多应用中,这比自适应集成更快。不同之处在于您传递函数值数组而不是函数句柄,这允许您的函数在可能的情况下对 numpy 数组进行操作。 -
@AmosEgel 我还没有考虑trapz,因为该函数可能有相当大的渐变并且可能需要一个非常精细的网格——但这绝对值得一试,感谢您的推荐。我还可以看看 2d gauss-Legendre 正交是否可以节省时间......
标签: python matlab scipy numerical-integration