Кумулятивная функция нормального распределения в C/C++

Я задавался вопросом, были ли функции статистики, встроенные в математические библиотеки, которые являются частью стандартных библиотек C++ как cmath. В противном случае можете Вы парни рекомендовать хорошую библиотеку статистики, которая имела бы кумулятивную функцию нормального распределения?Заранее спасибо.

Строго говоря, я надеюсь использовать/создавать кумулятивную функцию распределения.

47
задан Tyler Brock 23 August 2010 в 18:10
поделиться

3 ответа

Я понял, как это сделать с помощью gsl, по предложению людей, которые ответили до меня, но затем нашел небиблиотечное решение (надеюсь, это поможет многим людям, которые ищут как и я):

#ifndef Pi 
#define Pi 3.141592653589793238462643 
#endif 

double cnd_manual(double x)
{
  double L, K, w ;
  /* constants */
  double const a1 = 0.31938153, a2 = -0.356563782, a3 = 1.781477937;
  double const a4 = -1.821255978, a5 = 1.330274429;

  L = fabs(x);
  K = 1.0 / (1.0 + 0.2316419 * L);
  w = 1.0 - 1.0 / sqrt(2 * Pi) * exp(-L *L / 2) * (a1 * K + a2 * K *K + a3 * pow(K,3) + a4 * pow(K,4) + a5 * pow(K,5));

  if (x < 0 ){
    w= 1.0 - w;
  }
  return w;
}
9
ответ дан 26 November 2019 в 19:32
поделиться

Повышение так же хорошо, как и стандарт: D, держите: математическое / статистическое ускорение .

9
ответ дан 26 November 2019 в 19:32
поделиться

Вот автономная реализация C ++ кумулятивного нормального распределения в 14 строках кода.

http://www.johndcook.com/cpp_phi.html

#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";
}
32
ответ дан 26 November 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: