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