离散点上的快速 C++ 数值积分

问题描述 投票:0回答:2

我必须在 3D 空间上进行大量集成。我对所述空间进行了(网格)离散化(例如,在每个方向上等距放置 30 个点),我知道我想要集成的函数值。我不能给出像 f(x,y,z) = ....

这样的函数形式

是否有一个快速的 C++ 库可以做到这一点?到目前为止,我使用 MATLAB 函数

trapz(...)
实现了这一点,但我需要最大限度地减少单个集成之间的开销时间并整体加速我的代码,因此我转向 C++。 据我了解,所有 GNU 科学图书馆数字积分都需要一个函数句柄,因此需要一个函数形式,使它们对我的应用程序毫无用处。

一个非常相似的问题被问到here,但仍然没有答案。

c++ matlab numerical-integration
2个回答
2
投票

cubature 库 提供接受一组离散函数值的多维积分例程,以及一系列用于自定义积分方法的其他选项。该库是用 C 语言编写的,但如果您更喜欢在 C++ 中工作,也可以使用 C++ 包装器。

另一个选项是 Quasi-Monte Carlo Integration Library。该库提供了使用准蒙特卡罗方法进行多维积分的例程,与传统的蒙特卡罗方法相比,它可以更快、更准确。该库是用 C++ 编写的,包括离散和连续被积函数的例程。


0
投票

只要对数组中的值求和就可以很好地近似于

trapz
所做的事情,假设样本间隔相等。

对于梯形法,在1D中,两个端点只占1/2(加权)。在 2D 中,假设一个矩形域,四个角点应该只占 1/4,边缘点应该占 1/2。在 3D 中,您有 8 个顶点点占 1/8,沿域边缘的点占 1/4,沿域面的点占 1/2。但是只计算所有具有相同权重的点也是有效的。

要获得正确的幅度,只需将求和结果除以样本间距即可。在 2D 中,这是 x 间距乘以 y 间距;在 3D 中,它是三个间距的乘积。

对于非均匀间距,过程有点复杂,但最终很容易实现。我不会担心找到执行此操作的库,从头开始实施比向项目添加依赖项更容易。 (当然,如果您已经在使用实现此功能的库,那么使用现有功能更有意义。)

© www.soinside.com 2019 - 2024. All rights reserved.