我正在用 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 之前我无法停止循环,因为有时精度甚至没有达到第一个十进制数字。因此这种方法无法达到可接受的近似值。