无穷积分有两个问题:收敛性和收敛值。也就是说,积分是否收敛?如果是,它会收敛到什么值?有保证收敛的积分,但其值不可能精确确定(尝试从e^(-x^2)的1到无穷大的积分)。如果不能精确返回,那么在数学上就不可能得到精确的答案,只剩下近似值。ApacheCommons使用了几种不同的近似方案,但所有这些方案都需要使用有限边界来保证正确性。
得到适当答案的最好方法是反复计算有限积分,不断增加边界,并比较结果。在伪代码中,它看起来像这样:
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应该足够快,能够在不花费荒谬的时间的情况下处理它。