【问题标题】:Numerical computation in JavaJava中的数值计算
【发布时间】:2009-12-05 08:47:41
【问题描述】:

好的,所以我正在尝试使用 Apache Commons Math 库来计算双积分,但它们都是从负无穷大(到大约 1),并且需要很长时间来计算。在java中还有其他方法可以进行此类操作吗?或者它应该运行“更快”(我的意思是我实际上可以在我死前的某一天看到结果)而我做错了什么?

编辑:好的,感谢您的回答。至于我一直试图计算的是高斯 Copula:

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

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

【问题讨论】:

  • 是的,数到无穷大确实需要一些时间
  • 您是否尝试过以不同的方式看待问题?就像从 1 开始积分到负无穷大,当您的项的贡献不超过某个小增量时停止。
  • 你有没有试过把你的函数扔给 Wolfram Alpha 让它预先消化(如果可能的话)?
  • 问题是它是一些随机的财务方程,所以我怀疑我可以简化它,我需要它从 -oo 到我的值,因为,这就是方程所说的。
  • 我认为从 -oo 到某事的任何等式都可以在不简化的情况下计算出来。即使拥有世界上最快的计算机和最快的软件。这就是 -oo 和 oo 的目的

标签: java


【解决方案1】:

无限积分有两个问题:收敛和收敛值。也就是说,积分是否收敛?如果是这样,它收敛到什么值?有些积分可以保证收敛,但无法准确确定其值(尝试从 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 中执行您的计算。事实上,在 any 语言中,使用 any 算法并没有保证可以做到这一点的方法——数学只是没有按照我们想要的方式计算。然而,在实践中,很多(尽管绝不是全部!)实际积分确实会收敛。根据我的经验,只有大约 20 次迭代会给你一个合理准确度的近似值,而 Apache 应该足够快来处理这个问题而不会花费太长时间。

【讨论】:

    【解决方案2】:

    假设您在 -infinity 上将 f(x) 积分为 1,然后替换 x = 2 - 1/(1-t),并在 0 .. 范围内进行评估 1. 请注意检查数学文本以了解如何做替代品,我有点生疏了,来不及了。

    【讨论】:

    • 根据功能,转换可能会有所帮助。
    【解决方案3】:

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

    因此,您要么找到可以计算的等效公式(使用真实数学),要么将下限替换为合理的大负值,然后查看是否可以对积分进行良好的估计。

    如果 Apache Commons Math 可以在有限时间内对具有无限边界的积分进行数值积分,他们不会免费提供它 ;-)

    【讨论】:

      【解决方案4】:

      也许这是你的算法。

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

      如果您使用的是高斯或对数求积,您的运气可能会更好。

      您尝试集成的功能是什么,您使用的算法是什么?

      【讨论】:

        猜你喜欢
        • 2022-04-12
        • 2016-09-03
        • 2015-12-03
        • 2018-02-26
        • 2015-06-01
        • 2016-09-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多