【问题标题】:Numerical Integration with c++ on a given mesh with fixed constant discretisation在具有固定常数离散化的给定网格上使用 c++ 进行数值积分
【发布时间】:2012-02-19 00:15:02
【问题描述】:

我有以下问题:

我的 c++ 代码可以计算两个函数

f1(i1,i2,i3,i4)

f2(j1,j2)

对于每组 {i1,i2,i3,i4},我得到一些 f1 的值,对于每组 {j1,j2},我得到一些 f2 的值。

集合 {i1,i2,i3,i4} 和 {j1,j2} 在 FIXED 网格上给出,具有一些恒定离散化步长“h”。

我需要用数学语言计算积分 F3(x1,x3)=Integral[f1(x1,x2,x3,x4)*f2(x3,x4) dx3 dx4]

简单的求和不够好,因为 f2 有很多跳转。

是否有一些 c++ 库可以进行这种集成?或者一些易于实现的算法(我不太擅长c++)

非常感谢

【问题讨论】:

    标签: c++ algorithm math integration numerics


    【解决方案1】:

    你提到你知道 f2 上的跳跃,你不能把 f2 分成 f2 = f2a + f2b,其中; f2a 是一个光滑函数,在其上,传统的数值积分方法就足够了,而 f2b 是一个非常简单的带有跳跃的函数,因为它简单,所以可以解析地计算面积。然后您可以添加值,因为积分是线性运算。我认为这完全取决于你对 f2 的了解程度。

    【讨论】:

      【解决方案2】:

      积分是为实参函数定义的。因此,如果您只知道固定网格上的函数,则需要提供一条附加规则,说明如何为网格点之间的参数定义函数。这真的与编程没有太大关系,它只是数学。

      例如,如果您知道您的函数相当平滑,则可以使用线性插值。更复杂的事情,如果你需要的话。但是如果没有这种规则,集成问题就没有很好地定义。

      一旦你有了这样的规则——它只能来自你的函数的潜在含义——你就可以开始选择一个集成算法了。对于四个变量的函数,我会赞同 Johan Lundberg 的建议,即研究蒙特卡洛积分器。

      【讨论】:

        【解决方案3】:

        如果您只有网格点的值,而没有更多关于曲线形式的数学知识,那么没有什么比简单的求和更好的了。

        除了改变网格或完全使用其他方法,如http://en.wikipedia.org/wiki/Monte_Carlo_integration,别无他法

        【讨论】:

        • 假设我知道 f2 上的跳跃并假设 f1 足够平滑。在这种情况下我该怎么办?
        • 我的意思是,例如,如果您的函数是区域分析的,如果它们是阶跃函数、样条曲线、多项式等。那么您可以在这些区域中进行精确积分并对区域求和。你知道 f2 的确切形状比 binning 的精度更高吗?那么为什么不能评估任意位置的函数进行集成呢?它们是否非常耗时,或者您是否以表格形式从其他地方获取功能?另请查看@ElKamina 的答案。您需要一个 2d 版本,例如 math.fullerton.edu/mathews/n2003/simpsonsrule2dmod.html
        • 对于 Monte Carlo,请查看 VEGAS 和 MISER good ol' fortran 子例程。您也许可以在 www.netlib.org 上找到它们,或者在 Numerical Recipes 的书中找到它们的 C 版本。它们可能有助于应对 f2 不规则的事实。
        【解决方案4】:

        您可以使用辛普森法则 (http://en.wikipedia.org/wiki/Simpson%27s_rule)。但是,正如 Johan 所提到的,如果 f2 陡峭且不稳定,则减小步长 h 是唯一的解决方案。您可能要考虑的另一种方法是在网格中使用变量 h。那就是:

        1. Start with a global common h
        2. Divide the space into smaller subspaces
        3. Calculate integral for each subspace
        4. Recalculate integral for each subspace using step size h/2
        5. For only subspaces where difference between integrals (h and h/2) is substantial repeat the above mentioned steps (From step 3)
        

        【讨论】:

        • 很好,但他声称如果修复了网格。此外,您建议的方法仅适用于表现良好的函数。
        • @JohanLundberg 我完全同意你的看法!
        猜你喜欢
        • 2011-08-27
        • 2018-10-11
        • 2017-11-10
        • 2012-04-10
        • 2019-02-11
        • 1970-01-01
        • 1970-01-01
        • 2012-06-04
        • 1970-01-01
        相关资源
        最近更新 更多