2009-12-04 49 views
1

好吧,所以我试图使用Apache Commons Math库来计算双积分,但它们都来自负无穷大(大约为1),并且需要很长时间来计算。在java中有没有其他的方式来做这些操作?或者它应该“更快”(我的意思是我可以在死前一天看到结果),我做错了什么?在Java中的数值计算

编辑:好的,谢谢你的答案。至于什么我一直在试图计算它的高斯系词: alt text

因此,我们有一个标准的二元正态累积分布函数,它接受作为参数2个逆标准正态累积分布函数,我需要整数计算是(我知道有一个用于标准正态累积分布的Apache Commons Math函数,但是我没有找到逆和双变量版本)。

EDIT2:我的朋友曾经说过“啊是Java之美,无论你想做什么,有人已经做到了”我发现我需要在这里http://www.iro.umontreal.ca/~simardr/ssj/非常好的库概率等

+2

是的,计数到无穷大倾向于需要一些时间 – ChssPly76 2009-12-04 19:41:18

+0

你试过用不同的方式来看问题吗?就像从1开始积分并转向负无穷大一样,停止当你的术语不会超过一些小的三角洲。 – jabbie 2009-12-04 19:44:15

+0

您是否尝试过在Wolfram Alpha上投掷您的功能以使其预消化(如果可能)? – 2009-12-04 19:45:47

回答

2

有两个问题与无穷积分:融合和价值的-收敛。也就是说,积分是否会收敛?如果是这样,它会收敛到什么价值?有积分保证收敛,但其值不可能精确确定(尝试积分从1到无限的e ^( - x^2))。如果它不能完全返回,那么一个确切的答案在数学上是不可能的,这只能做到近似。 Apache Commons使用几种不同的逼近方案,但都需要使用有限边界来实现正确性。

获得正确答案的最佳方法是反复评估有限积分,并且不断增加边界,然后比较结果。在伪代码,它会是这个样子:

double DELTA = 10^-6//your error threshold here 
double STEP_SIZE = 10.0; 
double oldValue=Double.MAX_VALUE; 
double newValue=oldValue; 
double lowerBound=-10; //or whatever you want to start with--for (-infinity,1), I'd 
         //start with something like -10 
double upperBound=1; 

do{ 
    oldValue = newValue; 

    lowerBound-= STEP_SIZE; 
    newValue = integrate(lowerBound,upperBound); //perform your integration methods here 
}while(Math.abs(newValue-oldValue)>DELTA); 

最后,如果积分收敛,那么你会得到足够的重要的东西在不断扩大的范围进一步不会产生有意义的信息。

尽管如此,如果积分不会收敛,这种事情可能会爆炸性地变坏。在这种情况下,可能会出现以下两种情况之一:终止条件永远不会满足,并且陷入无限循环,或积分值无限期地围绕某个值振荡,这可能会导致终止条件不正确地满足(给不正确的结果)。

为了避免第一,最好的办法是把在步骤才能返回之前的一些最大数量 - 这样做应该停止潜在的无限循环,可能导致。

为了避免第二个,希望这不会发生,或者证明该积分器必须收敛(三个呼微积分2,任何人吗?;-))。

要正式回答你的问题,不,没有其他的这种方式来执行你的计算在java中。实际上,在任何语言中都没有保证的方法,有任何算法 - 数学只是不符合我们希望的方式。然而,在实践中,很多(尽管绝非全部!)实际积分确实会聚合;根据我的经验,只有大约20次迭代才能给出合理准确性的近似值,Apache应该足够快以处理该问题,而不会浪费太长时间。

1
一切

其中一个边界是无限的数值积分的结果也有很好的机会无限。这将需要无限的时间来证明它);

所以,你要么找到一个等价的公式(使用真正的数学),可以计算出来,或者用合理的大负值代替下界,看看,如果你能得到一个好的积分估计。

如果Apache下议院数学可以用于在有限时间内无限边界积分数值积分,他们不会给它免费;-)

2

假设您将f(x)over-infinity积分为1,则代入x = 2 - 1 /(1-t),并在范围0..1上进行评估。注意检查数学文本以了解如何做替代品,我有点生疏,在这里太晚了。

+0

根据功能的不同,转换可能会有所帮助。 – duffymo 2009-12-04 23:04:20

0

也许这是你的算法。

如果你正在做一些像辛普森规则那样幼稚的事情,那可能需要很长时间。

如果你使用高斯或对数正交,你可能会有更好的运气。

你试图整合的功能是什么,你使用的算法是什么?