1

我正在用 Java 开发软件。我有一个高斯分布,我必须计算累积密度函数 (CDF)。

由于 CDF 的公式涉及 ERF 函数,该函数应该正式地通过积分计算(在 Java 中计算它是可怕的),我发现泰勒级数展开对我的案例非常有趣:

厄夫泰勒

让我们专注于 ERF 计算。这是我写的代码:

private static double getErf(double x){
    double sumTaylorExpansion = x;
    double prevSumTaylorExpansion;
    double num1 = 1; //first factor of numerator
    double num2 = x; //second factor of numerator
    double den1 = 1; //first factor of denominator
    double den2 = 1; //second factor of denominator
    int n = 1; //cycle invariant
    do {
        prevSumTaylorExpansion = sumTaylorExpansion;
        num1 *= -1;
        num2 *= Math.pow(x, 2);
        den1 += 2;
        den2 *= n;
        sumTaylorExpansion += ((num1 * num2) / (den1 * den2));
        n++;
    }
    while (Math.abs(sumTaylorExpansion - prevSumTaylorExpansion) > 0.00000000000001);
    return (2/Math.sqrt(Math.PI))*sumTaylorExpansion;
}

如果这个方法的输入例如是1.5,那么结果是正确的。但是如果我尝试输入 32,它会返回 NaN。由于公式中涉及的值不断增长,这显然是与数值分析有关的问题。哪种方法可以计算近似结果?

请注意,在获得 NaN 之前我无法停止循环,因为有时精度甚至没有达到第一个十进制数字。因此这种方法无法达到可接受的近似值。

4

1 回答 1

0

由于当 x 很高时该算法实际上没有用,所以我使用了另一种实现,它给出了近似结果。就我的目的而言,没关系!公式如下: erf-近似

于 2016-01-30T16:13:28.633 回答