誤差関数
誤差関数(ごさかんすう、error function)は、数学におけるシグモイド形状の特殊関数(非初等関数)の一種で、確率論、統計学、物質科学、偏微分方程式などで使われる。ガウスの誤差関数とも。定義は以下の通り。
相補誤差関数 (complementary error function) は erfc と表記され、誤差関数を使って以下のように定義される。
1-\operatorname{erf}(x) \\
& = \frac{2}{\sqrt{\pi \int_x^{\infty} e^{-t^2}\,dt = e^{-x^2} \operatorname{erfcx}(x)
\end{align} }
スケーリング相補誤差関数(scaled complementary error function) erfcxも定義される
(アンダーフローを避けるために、 erfc の代わりに用いる)。
複素誤差関数 (complex error function) はw\left(x\right)と表記され、やはり誤差関数を使って次のように定義される(Faddeeva関数とも呼ぶ)。
誤差関数は奇関数である。
任意の複素数zについて、
また、次が成り立つ。
ここでz^{*}はzの複素共役である。
被積分関数f=\exp\left(-z^{2}\right)とf=\operatorname{erf}\left(-z\right)を複素z\operatorname{-}平面にプロットしたものを図2と図3に示す。
虚部f=\operatorname{Im}\left(f\right)=0となる点を結んだ線を太い緑色の線で表している。f=\operatorname{Im}\left(f\right)が負の整数となる点を結んだ線を太い赤色の線で表し、正の整数となる点を結んだ線を太い青色の線で表している。
f=\operatorname{Im}\left(f\right)が整数と整数の中間の一定値になる点を結んだ線を細い緑色の線で表し、実部f=\operatorname{Re}\left(f\right)=0が一定値になる点を結んだ線は、正の場合は青い細い線、負の場合は赤い細い線で表している。
実軸では、z\to\inftyでf=\operatorname{erf}\left(z\right)は単位元(1)に漸近し、z\to-\inftyで単位元(-1)に漸近する。虚軸では、\pm{\rm{i}\infty となる。
誤差関数は整関数である。(無限大以外で)特異点を持たず、テイラー展開は常に収束する。
定義にある積分は初等関数を使った閉形式では評価できないが、被積分関数\exp^{-z^{2} を対応するテイラー級数に展開して、項単位で積分すると、誤差関数のテイラー級数が以下のように得られる。
これは全ての複素数zについて成り立つ。
これを反復的に計算するには、以下のように定式化するのが扱い易い。
\frac{-(2k-1) z^2}{k (2k+1)}はk番目の項からk+1番目の項を得る係数を表している。
f=\operatorname{erf}\left(z\right)やf=\operatorname{erfc}\left(z\right)とf=\exp\left(-z^{2}\right)を比較するには、次の級数が利用できる。
\inftyにおいて誤差関数は正確に1になる(ガウス積分を参照)。
誤差関数の導関数は定義から即座に求められる。
誤差関数の不定積分は次のようになる。
逆誤差関数は次のような級数となる。
ここで、c_{0}=1であり、
となる。従って、次のような級数の展開が得られる(分子と分母に共通して出現する係数は省いてある)。
なお、誤差関数の正と負の無限大での値はそれぞれ正と負の1となる。
一連の何らかの測定値が正規分布になっていて、標準偏差が \sigma、期待値が0の場合、1つの測定値の誤差が-aとaの間になる確率は\operatorname{erf}\,\left(\,\frac{a}{\sigma \sqrt{2}\,\right)である。これは、例えば、デジタル通信システムでの符号誤り率の特定などに使える。
誤差関数と相補誤差関数は例えば、境界条件をヘヴィサイドの階段関数で与えたときの熱方程式の解に出現する。
\operatorname{erf} x + \operatorname{erfc} x \equiv 1 で、xの増加に伴って\operatorname{erf} x、\operatorname{erfc} xはそれぞれ急速に1, 0 に近づくため、クーロン力1/rなどの長距離相互作用を短距離成分\operatorname{erfc} r/rと長距離成分\operatorname{erf} r/rに分けるのに用いられる(エバルトの方法)。
相補誤差関数(および誤差関数)の大きなxについての漸近展開は次のようになる。
この級数は有限なxについては発散する。しかし、最初の方の幾つかの項だけで\operatorname{erfc}\left(x\right)のよい近似が得られ、テイラー展開よりも収束が早い。
次のような近似がある。
ここで、
このような近似(曲線あてはめ)は、実軸付近の誤差関数の値について、少なくとも十進で1桁の精度はある。
誤差関数は正規分布の累積分布関数(CDF)\Phiと基本的には同じであり、単にスケールと解釈が異なるだけである。実際、標準正規分布について次の関係が成り立つ。
また、\operatorname{erf}および\operatorname{erfc}について変形すると次のようになる。
2 \Phi \left ( x \sqrt{2} \right ) - 1 \\
\mathrm{erfc}\left(x\right) &= 2 \left[ 1 - \Phi \left ( x \sqrt{2} \right )\right]
\end{align}
従って、誤差関数は、正規分布におけるテール確率であるQ関数とも密接に関連する。Q関数は誤差関数を使って次のように表現できる。
\frac{1}{2} - \frac{1}{2} \operatorname{erf} \Bigl( \frac{x}{\sqrt{2 \Bigr)
}
\Phi\,の逆関数は標準分位関数またはプロビット関数として知られており、逆誤差関数を使って次のように表現できる。
\Phi^{-1}(p) = \sqrt{2}\,\operatorname{erf}^{-1}(2p-1) = -\sqrt{2}\,\operatorname{erfc}^{-1}(2p)
確率論や統計学では標準正規分布の累積分布関数の方がよく使われ、誤差関数は他の数学の分野で使われる傾向がある。
誤差関数はミッタク=レフラー関数の特殊ケースであり、合流型超幾何微分方程式としても以下のように表現できる。
\frac{2x}{\sqrt{\pi\,_1F_1\left(\frac{1}{2},\frac{3}{2},-x^2\right)}
フレネル積分を使った単純な表現法もある。正規化ガンマ関数Pと不完全ガンマ関数を使うと、次のように表せる。
\operatorname{sgn}\left(x\right) \  は符号関数である。
書籍によっては、より一般化した関数を論じている場合もある。
\frac{n!}{\sqrt{\pi \int_0^x e^{-t^n}\,\mathrm dt
=\frac{n!}{\sqrt{\pi}\sum_{p=0}^\infin(-1)^p\frac{x^{np+1}{(np+1)p!}\,}
例えば、
E_{0}\left(x\right)は原点を通る直線E_{0}\left(x\right)=\frac{x}{e\sqrt{\pi} となる。
E_{2}\left(x\right)は誤差関数\operatorname{erf}\left(x\right)である。
n!で割ると、奇数のnについてのE_{n}は互いに似たようなものになる(完全に一致する事は無い)。
同様に、偶数のnについてのE_{n}もn!で割ると互いに似たものになる(完全に一致する事は無い)。
n>0での全ての一般化された誤差関数のxが正のときのグラフは互いに似ている。
これらの一般化された誤差関数も x > 0 の場合にガンマ関数と不完全ガンマ関数を使って次のように表せる。
\frac{\Gamma(n)\left(\Gamma\left(\frac{1}{n}\right)-\Gamma\left(\frac{1}{n},x^n\right)\right)}{\sqrt\pi},
\quad \quad
x>0
従って、誤差関数は不完全ガンマ関数を使って次のように表せる。
相補誤差関数の累次積分は次のように定義される。
\int_z^\infty \mathrm i^{n-1} \operatorname{erfc}\, (\zeta)\;\mathrm d \zeta\,
これらには次のような冪級数がある。
\sum_{j=0}^\infty \frac{(-z)^j}{2^{n-j}j! \Gamma \left( 1 + \frac{n-j}{2}\right)}\,
ここから次のような対称性が得られる。
- \mathrm i^{2m} \operatorname{erfc}\, (z)
+ \sum_{q=0}^m \frac{z^{2q{2^{2(m-q)-1}(2q)! (m-q)!}
}
および、
\mathrm i^{2m+1} \operatorname{erfc}\, (z)
+ \sum_{q=0}^m \frac{z^{2q+1{2^{2(m-q)-1}(2q+1)! (m-q)!}\,
}
C言語の場合、C99でヘッダファイルの<math.h>にdouble erf(double x)およびdouble erfc(double x)という関数が宣言されている。
{erff(), erfcf()}という関数ペアはfloat型の値を扱い、{erfl(), erfcl()}という関数ペアはlong double型の値を扱う。
C++でも、C++11で<cmath>のヘッダファイルにerfおよびerfcが宣言されている。double、floatおよびlong double型がオーバーロードされている。
複素数を扱える誤差関数の実装は少ない。例えば、図2のようなグラフの描画は、Mathematicaを一般的な性能のコンピュータで実行した場合に数分かかる。
FORTRANでは、例えば、GFortran がERF(X)と倍精度のDERF(X)を提供している。
SageMathに拠る