c语言求正态分布函数的反函数,请问正态分布函数及其反函数的算法,用C++表示...

使用之前先找几个数试试,在下不保证绝对准确!!!

#include

//N(0,1)的分布函数;

double Normcdf (const double &x)

{

double y=x*x;

double fai=1/(exp(0.5*y)*2.50662827463100050);//sqrt(2*π)=2.506628274631000502415765284811;

double sum=0;

double result;

if (x>=0)

{

if (x>3.0)

{

for (int i=28;i>=1;i--) sum=i/(x+sum);

result=1-fai/(x+sum);

}

else

{

for (int i=28;i>=1;i--) sum=(0.5-i%2)*2*i*y/(2*i+1+sum);

result=0.5+fai*x/(1+sum);

}

}

else

result=1-Normcdf(-x);

return result;

}

//N(0,1)的密度函数;

double Normpdf (const double &x)

{

return 1/(exp(0.5*x*x)*2.50662827463100050);

}

//N(0,1)的分位数;

double Norminv (double const &x)

{

double *b=new double [11];

b[0]=0.1570796288e1;

b[1]=0.3706987906e-1;

b[2]=-0.8364353589e-3;

b[3]=-0.2250947176e-3;

b[4]=0.6841218299e-5;

b[5]=0.5824238515e-5;

b[6]=-0.1045274970e-5;

b[7]=0.8360937017e-7;

b[8]=-0.3231081277e-8;

b[9]=0.3657763036e-10;

b[10]=0.6936233982e-12;

double y=-log(4*x*(1-x));

double u=b[10];

if (x==0.5) return 0;

else

{

for (int i=9;i>=0;i--) u=u*y+b[i];

return (x-0.5)/abs(x-0.5)*sqrt(y*u);

}

delete[] b;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值