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

gab6jxml  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(226)

我必须在一个3D空间上做很多积分,我有一个(网格)离散化的空间(比如说,在每个方向上有30个等间距的点),我知道我要积分的函数值,我不能给予像f(x,y,z)= ...这样的函数形式。
有没有一个快速的C库可以做到这一点?到目前为止,我使用的MATLAB函数trapz(...)可以实现这一点,但我需要最小化单次积分之间的开销时间,并全面加快我的代码,因此我转向C。据我所知,所有的GNU科学库数值积分都需要一个函数句柄,因此需要一个函数形式,使得它们对我的应用程序毫无用处。
here也提出了一个非常类似的问题,但仍然没有答案。

holgip5t

holgip5t1#

The cubature library提供了多维集成例程,这些例程接受一组离散函数值以及一系列用于自定义集成方法的其他选项。该库是用C编写的,但如果您更喜欢使用C++,则可以使用C++ Package 器。
另一个选项是Quasi-Monte Carlo Integration Library。该库提供使用准蒙特卡罗方法的多维积分例程,该方法比传统蒙特卡罗方法更快、更准确。该库用C++编写,包括离散和连续被积函数的例程。

dgiusagp

dgiusagp2#

假设样本间隔相等,仅将数组中的值相加就可以很好地近似trapz的作用。
对于梯形方法,在1D中,两个端点仅占1/2在2D中,假设矩形域的四个角点应仅计为1/4,且边缘点计为1/2。在3D中,您将具有计为1/8的8个顶点,沿着域的边缘的点计为1/4,以及沿着域的面计数为1/2的点。但是仅仅计数具有相同权重的所有点同样有效。
要得到正确的幅度,只需将求和结果除以采样间隔。在2D中,这是x间隔乘以y间隔;在3D中,它是三个间距的乘积。
对于非均匀间距,这个过程有点复杂,但最终很容易实现。我不担心找到一个库来做这件事,从头开始实现比向项目添加依赖项更容易。(当然,如果你已经在使用一个库来实现这件事,使用现有的功能会更有意义。)

相关问题