Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泰勒展开的高斯累积密度函数_Java_Math_Numerical Methods_Taylor Series - Fatal编程技术网

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

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

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

由于该算法在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编译器优化,所以您可能不会看到任何显著的性能提升。)