等间距二维网格上的快速自适应求积

计算科学 matlab C 正交 自适应网格细化
2021-12-27 10:20:09

我需要对以下形式的二维积分进行数值计算:

I(θ)=0101φθ(x,y)dxdy

在哪里φθ是一系列平滑函数,索引为θ; 我需要评估I(θ)对于大量(>106) 的θiΘ, 这是给定的。

对于问题是如何设置的,我可以评估φθ在精细的等间距二维网格上(每次评估都涉及一些乘法),我无法评估φθ在其他点上。

由于网格很好,我可以简单地计算I(θi)通过梯形或辛普森规则。然而,这在计算上变得极其昂贵且不必要。对于许多(但不是全部)值θ,φθ(x,y)0对于集成域的大部分,和/或变化缓慢。

这里显而易见的是使用某种与固定等间距网格兼容的自适应积分方法。我的基本想法是从一个非常粗糙的子网格开始,评估每个子单元格中的积分和误差估计,并在此基础上决定要“放大”哪些单元格并用细化的网格重新计算。重复这个几次。有很多方法可以天真地做到这一点,但我对最先进的解决方案很感兴趣。

我的问题是:

  • 计算(子)积分的最佳(最快和精确)正交方法是什么?
  • 挑选细胞进行精炼的最佳方法是什么?
    • 如果我使用相对或绝对误差的度量,那么计算它的最佳方法是什么?
  • 有什么替代的想法吗?

作为记录,我正在使用 MATLAB,但我计划通过 MEX 文件在 C 中对这部分进行编码,因为我怀疑自适应位是否可以有效地矢量化,并且我希望它尽可能快。

1个回答

我认为我不太清楚为什么自适应方案会更好。与梯形规则的集成非常便宜:它本质上只是每个网格点的一次加法和一次乘法。因为你已经评估了你的被积函数φθ在每个网格点,积分求和在我看来是一个完全可以忽略不计的额外步骤:当然,在这些网格点评估被积函数肯定比实际求和要昂贵得多。

当然,您可能有太多的网格点,需要将被积函数的值存储在磁盘上的网格点或大块内存中,这需要将数据加载回内存或从内存加载到处理器缓存。这种情况下的解决方案是在您首先评估被积函数的同一循环中进行求和。