单变量向量被积函数的自适应数值积分

计算科学 算法 C++ 正交
2021-12-09 18:28:32

背景和问题表述

我正在尝试用 C++ 编写一个简单的程序,该程序执行向量值被积函数(在一个变量中)的自适应数值积分,即

abf¯(x) dx

其中f¯={f1,f2,...,fn}

我知道有很好的库可以做到这一点(例如GSLCubature),但我不能使用其中任何一个,因为它们在 GNU GPL 下。另一方面,我认为这些库有点涉及到我的简单问题。但是如果有我可以使用的库,我可能会使用它!

我需要的是一些简单的东西,比如自适应Gauss-KronrodGauss-Lobatto求解器,但Newton-Cotes可能就足够了。

在此之前,我一直在使用 Gauss-Lobatto 算法,这是受此代码的启发,理想情况下,我只需修改该算法以使其能够处理向量被积函数。

在这样做之前,我尝试“矢量化”一个更简单的算法,即自适应中点规则算法(即矩形 Newton-Cotes)。这样做时,我意识到很难“矢量化”算法并保持tail-recursion而且我注意到在这个简单算法中移除尾递归时,性能会显着下降(~30%)。所以我想自适应 Gauss-Lobatto 算法的影响会更大。

所以总结一下,这是我的一些问题:

第一季度

在编写自己的自适应算法时,如果我不能保持尾递归,我应该避免使用递归吗?

第二季度

有没有我可以使用的库来解决我的问题,并且它的许可限制比 GNU GPL 少?(LGPL 应该没问题)。

提前致谢!

2个回答

我认为您正在尝试做一些本质上不可能(或至少效率低下)的事情:如果您想同时集成不同的功能,您如何能够“适应”?

自适应正交的本质是您的算法尝试检测被积函数的难部分并相应地细分积分区间。如果您要求算法同时为不同的功能执行此操作,该算法如何有效地执行此操作?

如果您正在寻找限制较少的库,为什么不使用所有正交库之母:Piessens等人的 Quadpack?它是用 FORTRAN77 编写的,但您可以用 C++ 链接到它。

由于您的问题可以表示为一组独立的常微分方程,其中是时间变量,您可以使用Boost Odeint库。您应该可以轻松地修改教程中给出的示例以解决您的问题。x