2

我正在使用此处概述的方法来确定 F 检验的临界 F 值。我的问题是beta 函数是一个整体。我的 x 和 y 分别是 0.5 和 248。我尝试使用以下(Java)代码通过求和进行集成。

static double BetaFunction(double x, double y){
    double betaFunction=0.0;
    double inc=0.00001, t=0;
    double xM1=x-1, yM1=y-1;

    do{
        t+=inc;         
        betaFunction+=Math.pow(t, xM1)*Math.pow(1.0-t, yM1)*inc;
    } while (t<1.0);

    return betaFunction;
}

不幸的是,返回值很大程度上取决于我为 inc 选择的值。随着该值的减小,运行时间线性增加,精度以对数方式提高。

有没有更好的方法来做到这一点?

4

2 回答 2

2

所以你想做一个逆的、不完全的 beta 函数。很久以前,我在一个遥远的星系中写了其中一个。当然,今天我只是在 MATLAB 中调用 betaincinv。

您根本不想通过小步长的数值积分来做到这一点。当然不像你在这里那样作为矩形规则集成。请注意,对于像这样的参数,beta 的形状有些令人讨厌。(好吧,有点讨厌是一种很好的表达方式。这真的很讨厌。)

我记得 Abramowitz & Stegun 有一些近似值会有所帮助。然后,您可以使用牛顿法的快速步骤来细化结果。这很好用,因为积分的导数很容易评估。

于 2013-08-29T20:29:12.587 回答
1

如果没有封闭形式的积分解决方案,您可能会做的最好的事情是使用斯特林近似(http://en.wikipedia.org/wiki/Stirling%27s_approximation

这是一个封闭形式的解决方案,接近“大”n 的实际值。

sqrt(2Pi)*x^(x-.5)*y^(y-.5)/(x+y)^(x+y-.5)

计算它至少可以在 和 的线性时间内x完成y。您必须自己决定在什么范围内使用它以及您可以接受哪些错误。

于 2013-08-29T20:20:59.060 回答