用c++在给定网格上进行数值积分,离散化为固定常数

Numerical Integration with c++ on a given mesh with fixed constant discretisation

本文关键字:离散化 数值积分 常数 c++ 网格      更新时间:2023-10-16

我有以下问题:

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

f1(i1,i2,i3,i4)

f2(j1,j2)

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

集合{i1,i2,i3,i4}和{j1,j2}是在具有一些常数离散化步长"h"的FIXED网格上给出的。

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

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

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

非常感谢

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

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

您可以使用Simpson规则(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)

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

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

一旦你有了这样一个规则——它只能来自你的函数的底层含义——你就可以开始选择一个积分算法了。对于四个变量的函数,我支持Johan Lundberg关于研究蒙特卡罗积分器的建议。

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