用c++在给定网格上进行数值积分,离散化为固定常数
Numerical Integration with c++ on a given mesh with fixed constant discretisation
我有以下问题:
我的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的了解。
- 如何为静态常量模板化专用整数值分配存储
- 没有额外参数的函数的 GSL 数值积分
- 传递通用函数,用于梯形规则的数值积分
- gsl多变量数值积分
- C++ 实例化新对象时不接受继承方法默认参数值
- C :(不重复)积分静态成员初始化(不仅是声明!),导致链接器错误,原因
- 用整数值初始化非常量参考
- 使用模块化算法将积分器转换为数组时出现问题
- 如何对大整数值进行模化
- 计算C 中的数值积分
- 积分常量与 A 类型的部分特化
- std::cout在编译时等效,或者在c++11中编译时常数值的static_assert字符串化
- 如何使用整数值中的数字符号初始化字符数组
- 类中只能初始化静态常量积分数据成员
- 数值积分:使模板函数只接受函数名或使用两个参数调用的函数
- lambda函数与gsl的数值积分
- 物理引擎的数值积分有哪些好算法
- 用c++在给定网格上进行数值积分,离散化为固定常数
- 梯形规则的数值积分c++
- 如何在R中使用Rcpp在c++中做数值积分