有两个问题与无穷积分:融合和价值的-收敛。也就是说,积分是否会收敛?如果是这样,它会收敛到什么价值?有积分保证收敛,但其值不可能精确确定(尝试积分从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应该足够快以处理该问题,而不会浪费太长时间。
是的,计数到无穷大倾向于需要一些时间 – ChssPly76 2009-12-04 19:41:18
你试过用不同的方式来看问题吗?就像从1开始积分并转向负无穷大一样,停止当你的术语不会超过一些小的三角洲。 – jabbie 2009-12-04 19:44:15
您是否尝试过在Wolfram Alpha上投掷您的功能以使其预消化(如果可能)? – 2009-12-04 19:45:47