【问题标题】:Quicker calculation of double integral in python (like MatLab's integral2)python中双积分的更快计算(如MatLab的integral2)
【发布时间】: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 of jit` 编译fun 可能很重要。numpy/scipy 没有做这样的事情。但是你没有没有告诉我们任何关于 fun 的事情。
  • 有趣,谢谢@hpaulj。有关“乐趣”的更多但仍然有限的详细信息,请参见上文。你认为我最好的选择是考虑 jit-ting '有趣'(不确定它是如何工作的)。
  • 关于 jit 编译:这可以在 Python 中使用 Numba 完成。
  • 您是否考虑过使用梯形规则 (np.trapz) 等非自适应积分方案?在许多应用中,这比自适应集成更快。不同之处在于您传递函数值数组而不是函数句柄,这允许您的函数在可能的情况下对 numpy 数组进行操作。
  • @AmosEgel 我还没有考虑trapz,因为该函数可能有相当大的渐变并且可能需要一个非常精细的网格——但这绝对值得一试,感谢您的推荐。我还可以看看 2d gauss-Legendre 正交是否可以节省时间......

标签: python matlab scipy numerical-integration


【解决方案1】:

首先,简介。如果配置文件告诉您它正在评估 fun,那么您最好的选择是 numba.jit 它,或者在 Cython 中重写它。

【讨论】:

    【解决方案2】:

    我创建了一次quadpy,因为 scipy 求积函数对我来说太慢了。如果您可以将您的被积函数带入其中一种形式(例如,具有权重函数exp(-x)exp(-x^2) 的二维平面),您应该看看。

    【讨论】:

      猜你喜欢
      • 2013-08-26
      • 2012-02-13
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      相关资源
      最近更新 更多