2010年1月22日 星期五

常態分配數值逼近法

以前在唸研究所做研究時,免不了要使用到常態分配!

原先都是使用 trapezoidal quadrature formula 積分的方法計算面積求出其累積機率。

雖然曾經懷疑為什麼 Excel 可以運算得這麼快,但是一直沒有去找到真正的解答。

直到最近又翻起 John Hull 的書籍,才知道可以運用逼近的方法達成..

Options, Futures, And Other Derivatives 6th Ed. p.297 中有提到其如何用數值逼近

其準確度到達小數第六位,在此列出其程式碼,希望能藉此幫助更多人。


class CDF
{
const double a1 = 0.31938153;
const double a2 = -0.356563782;
const double a3 = 1.781477937;
const double a4 = -1.821255978;
const double a5 = 1.330274429;
const double gamma = 0.2316419;

///
/// A polynomial approximation that gives six-decimal-place accuracy.
///

///
///
public static double N(double x){
double k = 1 / (1+gamma*x);
if(x>=0){
return (1 - _NProun(x)*(a1*k + a2*Math.Pow(k,2)+a3*Math.Pow(k,3)+a4*Math.Pow(k,4) + a5*Math.Pow(k,5)));
}else{
return (1 - N(-x));
}
}

private static double _NProun(double x){
return (1 / Math.Sqrt(2 * Math.PI)) * Math.Exp(-Math.Pow(x, 2) / 2);
}
}

2 則留言:

  1. 另一種方法
    可以內建幾個表值..
    然後再挑選最近 x 的值再去計算

    回覆刪除
  2. 我覺得這個方法比較好耶!
    因為他的時間複雜度空間複雜度相對而言較小

    還是要感謝你的分享!Thanks..

    回覆刪除