在具有固定常数离散的给定网格上与c ++进行数值积分

时间:2012-01-25 19:32:28

标签: c++ algorithm math integration numerics

我有以下问题:

我的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)=积分[f1(x1,x2,x3,x4)* f2(x3,x4)dx3 dx4]

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

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

非常感谢

4 个答案:

答案 0 :(得分:3)

如果你只有网格点上的值而没有关于曲线形式的进一步数学知识那么你可以做的比琐碎的求和更好。

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

之外别无其他

答案 1 :(得分:1)

您可以使用Simpson的规则(http://en.wikipedia.org/wiki/Simpson%27s_rule)。但是,正如约翰所提到的,如果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)

答案 2 :(得分:1)

为真实参数的函数定义了集成。因此,如果您只知道固定网格上的函数,则需要提供一个额外的规则,说明如何在网格点之间为参数定义函数。这与编程没什么关系,只是数学。

例如,如果您知道您的功能相当平滑,则可以使用线性插值。更复杂的事情,如果你需要。但是,如果没有这种规则,整合问题根本就没有明确定义。

一旦你有了这样的规则 - 这只能来自你职能的潜在意义 - 你可以开始选择一个整合算法。对于四个变量的函数,我首先提出了Johan Lundberg关于蒙特卡洛积分器的建议。

答案 3 :(得分:0)

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