Java 泰勒展开的高斯累积密度函数
我正在用Java开发软件。我有一个高斯分布,我必须计算累积密度函数(CDF) 由于CDF的公式涉及ERF函数,该函数应通过积分形式计算(在Java中计算它很可怕),因此我发现泰勒级数展开式对我的案例非常有趣: 让我们关注ERF计算。以下是我编写的代码:Java 泰勒展开的高斯累积密度函数,java,math,numerical-methods,taylor-series,Java,Math,Numerical Methods,Taylor Series,我正在用Java开发软件。我有一个高斯分布,我必须计算累积密度函数(CDF) 由于CDF的公式涉及ERF函数,该函数应通过积分形式计算(在Java中计算它很可怕),因此我发现泰勒级数展开式对我的案例非常有趣: 让我们关注ERF计算。以下是我编写的代码: private static double getErf(double x){ double sumTaylorExpansion = x; double prevSumTaylorExpansion; double n
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之前停止循环,因为有时精度甚至达不到第一个十进制数字。因此,这种方法无法达到可接受的近似值。由于该算法在x值较高时实际上没有用处,因此我使用了另一种实现,它给出了近似值。就我而言,这没关系!公式如下:
由于该算法在x值较高时实际上没有用处,因此我使用了一种替代实现,它给出了一个近似的结果。就我而言,这没关系!公式如下:
还有其他选择吗?但我的问题与Java实现有关:(1.当x=32时,序列是否收敛?2.一些性能改进建议:
x*x
比Math.pow(x,2)更有效
既然这是不变的,它应该在循环外计算。1.泰勒级数总是收敛。2.变量num2的更新不能在循环外计算!它必须每次更新。因此,现在的问题不是幂x^2。我的意思是计算x*x
并将其存储在循环外的变量中,然后使用它循环中的变量,而不是每次在循环中计算x*x
。(无论如何,JIT编译器可能会对其进行优化,因此您可能不会看到任何显著的性能提高。)有其他选择吗?但我的问题与Java实现有关:(1.序列是否在x=32时收敛?2.一些性能改进建议:x*x
比Math.pow(x,2)更有效
既然这是不变的,它应该在循环外计算。1.泰勒级数总是收敛。2.变量num2的更新不能在循环外计算!它必须每次更新。因此,现在的问题不是幂x^2。我的意思是计算x*x
并将其存储在循环外的变量中,然后使用它循环中的变量,而不是每次都在循环中计算x*x
。(它可能会被JIT编译器优化,所以您可能不会看到任何显著的性能提升。)