代码之家  ›  专栏  ›  技术社区  ›  Mateusz Dymczyk

Java中的数值计算

  •  1
  • Mateusz Dymczyk  · 技术社区  · 16 年前

    好吧,我想用ApacheCommons数学库来计算一个二重积分,但是它们都是从负无穷大(到1左右)开始的,而且要花很长时间来计算。在Java中有没有其他的操作方法?或者它应该“更快地运行”(我的意思是,在我死前的某一天我可以看到结果)而我做了错事?

    编辑:好的,谢谢你的回答。至于我一直试图计算的是高斯连接函数: alt text

    所以我们有一个标准的二元正态累积分布函数,它以两个反标准正态累积分布函数为参数,我需要整数来计算它(我知道标准正态累积分布有一个Apache Commons数学函数,但是我找不到反标准正态累积分布和二元分布的版本)。

    Edt2:正如我的朋友曾经说过的:“是的,Java的美,不管你想做什么,有人已经做到了”我找到了我需要的一切。 http://www.iro.umontreal.ca/~simardr/ssj/ 很好的概率库等。

    4 回复  |  直到 16 年前
        1
  •  2
  •   Svante    16 年前

    无穷积分有两个问题:收敛性和收敛值。也就是说,积分是否收敛?如果是,它会收敛到什么值?有保证收敛的积分,但其值不可能精确确定(尝试从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应该足够快,能够在不花费荒谬的时间的情况下处理它。

        2
  •  2
  •   Mark Thornton    16 年前

    假设将F(x)在无穷大上积分为1,然后将x=2-1/(1-t)代入,并在0范围内计算。1。注意,检查一下数学课本了解如何做下一步,我有点生疏,现在来不及了。

        3
  •  1
  •   Andreas Dolk    16 年前

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

    因此,你要么找到一个可以计算的等价公式(使用实数),要么用一个合理的大负值替换下界,然后看看,如果你能得到一个好的积分估计值的话。

    如果Apache Commons Math能够在有限时间内对无限界积分进行数值积分,他们就不会免费赠送它;-)

        4
  •  0
  •   duffymo    16 年前

    也许这是你的算法。

    如果你做了像辛普森法则这样的幼稚的事情,可能需要很长时间。

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

    你想集成的函数是什么,你使用的算法是什么?