多维不连续函数的数值积分

时间:2013-05-03 09:38:27

标签: numerical-methods scientific-computing montecarlo numerical-integration

我有一个函数f(x)= 1 /(x + a + b * I * sign(x))我想计算

的整体

dx dy dz f(x)f(y)f(z)f(x + y + z)f(x-y - z)

在整个R ^ 3上(b> 0且a,-b为有序单位)。这只是一个代表性的例子 - 实际上我有n< 7变量和fn的2n-1个实例,其中n个涉及n个积分变量,n-1个涉及积分变量的一些线性组合。在这个阶段,我只对粗略估计感兴趣,相对误差为1e-3左右。

我尝试了以下库:

  • 史蒂芬约翰逊的立方码:hcubature算法有效,但非常缓慢,即使n = 2也需要进行数亿次的被积函数评估。
  • HintLib:我尝试使用Genz-Malik规则,Cubens例程,VEGAS和MISER与Mersenne扭转器RNG进行自适应集成。对于n = 3,只有第一个似乎是一些可行的选择,但它再次需要数亿次的被积函数评估n = 3和relerr = 1e-2,这并不令人鼓舞。

对于集成区域,我尝试了两种方法:积分超过[-200,200] ^ n(即一个区域如此之大,以致它基本上捕获了大部分积分)和替换x = sinh(t)成为标准技巧。

我对数值分析没有太多经验,但可能困难在于sign()项的不连续性。对于n = 2和f(x)f(y)f(x-y),沿x = 0,y = 0,x = y存在不连续性。这些在原点周围形成一个非常尖锐的峰值(在各个象限中有不同的符号)和在x = 0,y = 0,x = y处的“脊”类型,被积函数的绝对值很大,并且符号变为你穿过它们。所以至少我知道哪些区域很重要。我在想,也许我可以做蒙特卡罗,但不知何故“告诉”算法提前聚焦的地方。但我不太清楚该怎么做。

如果您对如何使用合理数量的计算能力评估积分或如何使蒙特卡罗“想法”发挥作用,我将非常感激。我已经坚持了一段时间,所以任何输入都会受到欢迎。提前谢谢。

1 个答案:

答案 0 :(得分:0)

你可以做的一件事就是为你的蒙特卡洛积分使用一个指导函数:给出一个积分(为了简单起见,用1D写它)∫ f x )dx,将其写为∫ f x )/ g x g < / i>( x )dx,并使用g(x)作为您从中x采样的分布。

由于g(x)是任意的,因此构造它使得(1)它具有您希望它们位于f(x)的峰值,以及(2)这样您可以从x采样g(x) 1/(1+x^2)(例如,高斯,或{{1}})。

或者,您可以使用Metropolis型马尔可夫链MC。它将自己(几乎)找到被积函数的相关区域。 Here是一些微不足道的例子。