(相補)誤差関数と標準正規分布の関係

まぁどこにでも書いてあるような話ですが……。
標準正規分布の分布関数 \[ F(x) = \int_{-\infty}^x \frac{1}{\sqrt{2\pi}} \exp(-\frac{t^2}{2}) dt \]

が欲しかったのだがC++の標準ライブラリには入っていない。しかし<cmath>にある相補誤差関数erfcを利用してこれを計算することができる。
誤差関数\({\rm erf}(x) \)は \[ {\rm erf}(x) \equiv \frac{2}{\sqrt{\pi}} \int_0^x \exp(-t^2) dt \]

と定義される。相補誤差関数は\({\rm erfc}(x) = 1 - {\rm erf}(x) \)であり、 \begin{eqnarray} {\rm erfc}(x) &\equiv& 1 - {\rm erf}(x) \\ &=& \frac{2}{\sqrt{\pi}} \int_0^\infty \exp(-t^2) dt - \frac{2}{\sqrt{\pi}} \int_0^x \exp(-t^2) dt \\ &=& \frac{2}{\sqrt{\pi}} \int_x^\infty\ \exp(-t^2) dt \\ &=& \frac{2}{\sqrt{\pi}} \int_{-\infty}^{-x}\ \exp(-t^2) dt. \end{eqnarray}

途中、ガウス積分
\[ \int_{-\infty}^\infty \exp(-ax^2) dx = \sqrt{\frac{\pi}{a}} \]

および\(\exp(-t^2) \)の対称性を用いた。ここで\( t = \frac{\xi}{\sqrt{2}} \)とおけば

\[ {\rm erfc}(x) = \frac{2}{\sqrt{\pi}} \int_{-\infty}^{-\sqrt{2}x}\ \exp(-\frac{\xi^2}{2}) d(\frac{\xi}{\sqrt{2}}). \]

したがって分布関数は \begin{eqnarray} F(x) &=& \frac{1}{2} {\rm erfc}(-\frac{x}{\sqrt{2}}) \\ &=& \frac{1}{2}(1 - {\rm erf}(-\frac{x}{\sqrt{2}})) \\ &=& \frac{1}{2}(1 + {\rm erf}(\frac{x}{\sqrt{2}})) \end{eqnarray}

と表現できる。よって

  double normal (double d) {
    return ( 0.5 * erfc ( -d * M_SQRT1_2 ) );
  }

などとすればよいのでした。

参考文献