Re: [VBA ]Application.NormSDist函數
看板Visual_Basic作者OracleRoot (breakaway美夢成真)時間16年前 (2009/06/10 14:25)推噓1(1推 0噓 0→)留言1則, 1人參與討論串2/2 (看更多)
※ 引述《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
推
06/10 14:49, , 1F
06/10 14:49, 1F
討論串 (同標題文章)