通过泰勒展开的高斯累积密度函数

时间:2016-01-30 15:20:15

标签: java math numerical-methods taylor-series

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

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

erf-taylor

让我们专注于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之前我无法停止循环,因为有时精度甚至达不到第一个十进制数字。所以这种方法无法达到可接受的近似值。

1 个答案:

答案 0 :(得分:0)

由于该算法在x高时实际上并不实用,因此我使用了另一种实现方法,该方法给出了近似结果。为了我的目的,这没关系!公式如下: erf-approximated