Φ(x)累积密度函数的C ++实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30490125/article/details/80785164

正态分布函数

正态分布(Normal distribution)又名高斯分布(Gaussian distribution),是一个在数学、物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力。

若随机变量X服从一个数学期望为μ、标准方差为σ2的高斯分布,记为:

XN(N(μ,σ2),σ2)

则其概率密度函数为
这里写图片描述
N(0,1)=f(xμσ)

正态分布的期望值μ决定了其位置,其标准差σ决定了分布的幅度。因其曲线呈钟形,因此人们又经常称之为钟形曲线。我们通常所说的标准正态分布是μ = 0,σ = 1的正态分布。
这里写图片描述

累积分布函数

累积分布函数是指随机变量X小于或等于x的概率,用密度函数表示为:
这里写图片描述
这里写图片描述

为了计算累计分布函数,我们可以用查表法或者微分法。但对于编程来说,处于精确度和计算速度的考虑,二者都不能作为首选。这里给出一个快速计算的方案:https://www.johndcook.com/blog/cpp_phi/

#include <cmath>

double phi(double x)
{
    // constants
    double a1 =  0.254829592;
    double a2 = -0.284496736;
    double a3 =  1.421413741;
    double a4 = -1.453152027;
    double a5 =  1.061405429;
    double p  =  0.3275911;

    // Save the sign of x
    int sign = 1;
    if (x < 0)
        sign = -1;
    x = fabs(x)/sqrt(2.0);

    // A&S formula 7.1.26
    double t = 1.0/(1.0 + p*x);
    double y = 1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x);

    return 0.5*(1.0 + sign*y);
}
void testPhi()
{
    // Select a few input values
    double x[] = 
    {
        -3, 
        -1, 
        0.0, 
        0.5, 
        2.1 
    };

    // Output computed by Mathematica
    // y = Phi[x]
    double y[] = 
    { 
        0.00134989803163, 
        0.158655253931, 
        0.5, 
        0.691462461274, 
        0.982135579437 
    };

    int numTests = sizeof(x)/sizeof(double);
    double maxError = 0.0;
    for (int i = 0; i < numTests; ++i)
    {
        double error = fabs(y[i] - phi(x[i]));
        if (error > maxError)
            maxError = error;
    }

        std::cout << "Maximum error: " << maxError << "\n";
} 
展开阅读全文

没有更多推荐了,返回首页