倭算数理研究所

科学・数学・学習関連の記事を、「倭マン日記」とは別に書いていくのだ!

commons-math 解読 (17) : 誤差関数 Erf

今回から何回かにわたって org.apache.commons.math.special に定義されているクラスを見ていきます。 このパッケージにはいくつかの特殊関数 (special functions) が定義されています。 具体的には

  • 誤差関数 (error function) 関連
  • ガンマ関数 (gamma function) 関連
  • ベータ関数 (beta function) 関連

の関数です。 今回は誤差関数関連の関数について見ていきます。

誤差関数 Error Function

誤差関数を表すクラスは Erf で、誤差関数の値を返す static メソッドなどが定義されています:

package org.apache.commons.math.special;

public class Erf{
    public static double erf(double x){...}
    public static double erfc(double x){...}
}
  • erf() は誤差関数の値を返す
  • erfc() は相補誤差関数 (complementary error function) の値を返す

それぞれの定義については以下参照。

誤差関数 erf(x)

誤差関数 erf(x) は以下のように定義されています(wikipedia:誤差関数):

  { \displaystyle
\begin{align*}
    \textrm{erf}(x) = \frac{2}{\sqrt{\pi}}\int_0^x e^{-t^2}\;dt
\end{align*}
}

ガウス積分(の半分)

  { \displaystyle
\begin{align*}
    \int_0^\infty e^{-t^2}\;dt = \frac{\sqrt{\pi}}{2}
\end{align*}
}

に注意すると

  { \displaystyle
\begin{align*}
    \lim_{x\rightarrow\pm\infty}{\rm erf}(x) = \pm1
\end{align*}
}

となることが分かります(複号同順)

相補誤差関数 erfc(x)

相補誤差関数 { \textrm{erfc} (x) } は以下のように定義されています:

  { \displaystyle
\begin{align*}
    \textrm{erfc}(x)
        &= \frac{2}{\sqrt{\pi}}\int_x^\infty e^{-t^2}\;dt \\[2mm]
        &= 1 - {\rm erf}(x)
\end{align*}
}

積分犯意に注意。 また、誤差関数の極限値を使うと

  { \displaystyle
\begin{align*}
    \lim_{x\rightarrow\infty}{\rm erfc}(x) &= 0 & \lim_{x\rightarrow-\infty}{\rm erfc}(x) &= 2
\end{align*}
}

が成り立つことが分かります。

グラフ

関数はやはりグラフを描くのがいちばんだと思うので、Groovy と JFreeChart を使って以下のようにグラフを描いてみました:

@Grab('org.apache.commons:commons-math:2.2')
@Grab('jfree:jfreechart:1.0.12')

import org.apache.commons.math.special.Erf
import org.jfree.chart.*
import static org.jfree.chart.plot.PlotOrientation.VERTICAL
import org.jfree.data.function.Function2D
import org.jfree.data.general.DatasetUtilities

def erf = { double x -> Erf.erf(x)} as Function2D
def dataset = DatasetUtilities.sampleFunction2D(erf, 0d, 3d, 1000, 'erf')
def chart = ChartFactory.createXYLineChart(
                        'Error Function', 'x', 'y', dataset, VERTICAL, true, true, true)
ChartUtilities.saveChartAsPNG(new File('erf.png'), chart, 600, 400)

このスクリプトは誤差関数のみしか描画しませんが、相補誤差関数も一緒に描画すると以下のようになります:



定義域 [0, 3]

定義域 [-3, 3]

誤差関数と相補誤差関数は、直線 { y= \frac{1}{2} } に関して対称です。 ちなみに、誤差関数は原点に関して対称(つまり奇関数)でもあります。
特殊函数 (岩波 数学公式 3)

特殊函数 (岩波 数学公式 3)