C++ 正态分布、概率累积密度函数的使用(boost库)

在C++11以上中在# include <random> 头文件中包含了std::normal_distribution<>b;正态分布函数。

当然也可以下载boost库,里面已经有包装好的正态分布函数。

1.boost库可以在https://www.boost.org/中进行下载最新版的

2.boost库导入C++工程的方法可以参照博客https://blog.csdn.net/loongsking/article/details/80136004

3.导入好了boost库后示例代码如下

#include <boost\math\distributions\normal.hpp>
#include <iostream>
#include <random>
#include <math.h>
int main() {
	//std::normal_distribution<>b;
	
	boost::math::normal_distribution<> norm(0, 1);//期望,方差
	double PI = acos(-1);
	std::cout<<boost::math::cdf(norm,0)<<std::endl; //0.5  概率密度值,小于0的概率
	std::cout << boost::math::pdf(norm, 0) - 1 / (sqrt(2 * PI)) << std::endl; //0   正态分布函数值
	std::cout << boost::math::cdf(boost::math::complement(norm,1)) << std::endl; // 概率密度大于1的概率
	std::cout << boost::math::quantile(norm, 0.5) << std::endl;		//当概率密度小于0.5时对应的x值
	system("pause");
	return 0;
}

其中,要引入normal.hpp才能够使用正态分布,norm(0,1)代表(期望,方差),cdf用来求概率密度,pdf用来求正太分布函数对应的y值。

其实手动实现标准正太分布的概率累积函数也是可以的,也许更快,但是精度准确性有点差。我想到的累积函数是正态分布函数的积分,思路大概就是在x=0处进行泰勒展开,展开到五六阶倒数后精度可以大概到后5位小数左右。

(从其他地方拷贝过来的标准正态分布下的概率累积代码可以参考参考)

 

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);
}

 

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值