作者OracleRoot (breakaway美梦成真)
看板Visual_Basic
标题Re: [VBA ]Application.NormSDist函数
时间Wed Jun 10 14:25:51 2009
※ 引述《weast (kuan)》之铭言:
: 平常是使用C语言的
: 可是今天找资料找到一个VBA的code 看到里面有用到这个函数
: 所以上来问问看各位 这个函数的内容是做怎样的运算呢?
: 可否解释一下其数学内容 方便我应用到C里面
: 谢谢个位
标准常态分配机率密度函数(PDF)
f(z) = [1/sqrt(2*PI)] * exp (-z^2/2)
其中 z = (z-mean)/sigma
NORMSDIST回传标准常态分配的累积机率
ex:考试成绩服从常态分配,考生1000人,平均分数70,标准差10,想知道分数超过80人
数
先标准化
z = ( 80 - 70 ) / 10
P(Score < 80 ) => 分数小於80的累积机率,用NORMSDIST(1)可求出
标准常态累积密度函数(CDF)
N(z) = [ (1/sqrt(2*PI) ] * [ 积分(负无穷到z) exp(-z^2/2)dz
只能用近似公式求出N(z)值
if z>= 0
N(z) = 1-n(z) * (a1*k+a2*k^2+a3*k^3+a4*k^4+a5*k^5)
if z<0
N(z) = 1-N(-z)
其中n(z) 为f(z)
k = 1 / ( 1 + 0.2316419 * z )
a1=0.31938153
a2=-0.356563782
a3=1.781477937
a4=-1.821255978
a5=1.330274429
现成code
#include <math.h>
//#include <windows.h>
double Standard_Normal_Distribution(double d)
{
int flag=0; //Flag =1 if d<0
if(d<0)
{
flag=1;
d=fabs(d);
}
double rr=0.2316419;
double a1=0.31938153;
double a2=-0.356563782;
double a3=1.781477937;
double a4=-1.821255978;
double a5=1.330274429;
double k=1/(1+d*rr);
double M_PI=3.14159265359;
double value=1-exp(d*d/(-2))*(a1*k+a2*pow(k,2)+a3*pow(k,3)+a4*pow(k,4)
+a5*pow(k,5))/sqrt(2*M_PI);
if(flag) return 1-value;
else return value;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.167.60.247
1F:推 weast:了解 谢谢哩!! 06/10 14:49