誤差関数と相補誤差関数(math.erf, math.erfc)|Python
誤差関数(error function)は正規分布の累積分布関数と密接に関連しており、統計学・物理学・工学で広く使われる。Python では math.erf() と math.erfc() で計算できる。
誤差関数の定義
誤差関数 は次の積分で定義される。
ガウス積分を正規化したもので、 から の範囲の値を取る。
import math
print(math.erf(0)) # 0.0
print(math.erf(1)) # 0.8427007929497149
print(math.erf(2)) # 0.9953222650189527
print(math.erf(3)) # 0.9999779095030014
# 負の引数
print(math.erf(-1)) # -0.8427007929497149(奇関数)が大きくなると急速に に近づく。また、 という奇関数の性質を持つ。
相補誤差関数 erfc
相補誤差関数(complementary error function)は で定義される。
import math
x = 2
print(math.erf(x)) # 0.9953222650189527
print(math.erfc(x)) # 0.004677734981047266
print(1 - math.erf(x)) # 0.004677734981047288(微小な誤差)なぜ 1 - erf(x) を別関数として用意するのか。大きな では が に非常に近くなり、1 - erf(x) を直接計算すると桁落ちが生じる。erfc は内部で精度を保った計算を行うため、より正確な結果が得られる。
import math
x = 5
print(math.erf(x)) # 0.9999999999984626
print(1 - math.erf(x)) # 1.5374136927428943e-12
print(math.erfc(x)) # 1.5374597944280349e-12(より正確)誤差関数。 で 、 で に近づく。
相補誤差関数。 を精度よく計算する。大きな で有用。
正規分布との関係
標準正規分布の累積分布関数 は誤差関数で表現できる。
import math
def normal_cdf(x):
"""標準正規分布の累積分布関数"""
return 0.5 * (1 + math.erf(x / math.sqrt(2)))
# P(X ≤ 0) = 0.5(対称性)
print(normal_cdf(0)) # 0.5
# P(X ≤ 1) ≈ 0.841
print(normal_cdf(1)) # 0.8413447460685429
# P(X ≤ 1.96) ≈ 0.975(95% 信頼区間の片側)
print(normal_cdf(1.96)) # 0.9750021048517795統計学でおなじみの という値は、標準正規分布の両側 点に対応する。
応用例:品質管理での使用
製造業では、製品の寸法が規格内に収まる確率を計算することがある。平均 、標準偏差 の正規分布に従う製品が、 の範囲に収まる確率を求めてみよう。
import math
def normal_cdf(x):
return 0.5 * (1 + math.erf(x / math.sqrt(2)))
# ±3σ の範囲に収まる確率
prob_within_3sigma = normal_cdf(3) - normal_cdf(-3)
print(f'{prob_within_3sigma:.6f}') # 0.997300
# パーセント表示
print(f'{prob_within_3sigma * 100:.4f}%') # 99.7300%いわゆる「3σ ルール」で、約 の製品が規格内に収まることがわかる。
応用例:熱伝導方程式の解
物理学では、熱伝導方程式の解に誤差関数が現れる。半無限の棒の一端を加熱したとき、距離 、時刻 での温度変化は次のように表される。
ここで は熱拡散率、 は境界の温度だ。
import math
def temperature(x, t, T0=100, alpha=1e-5):
"""半無限棒の温度分布"""
if t <= 0:
return 0
arg = x / (2 * math.sqrt(alpha * t))
return T0 * math.erfc(arg)
# 表面から 1cm、10 秒後の温度
print(f'{temperature(0.01, 10):.2f}°C') # 84.27°C
# 表面から 1cm、100 秒後の温度
print(f'{temperature(0.01, 100):.2f}°C') # 95.32°C時間が経つにつれて、熱が奥まで伝わっていく様子が計算できる。
逆誤差関数
Python 3.13 から math.erfinv()(逆誤差関数)が追加された。それ以前のバージョンでは SciPy の scipy.special.erfinv() を使う。
# Python 3.13 以降
# import math
# print(math.erfinv(0.5)) # 0.4769362762044699
# SciPy を使う場合
from scipy.special import erfinv
print(erfinv(0.5)) # 0.4769362762044699逆誤差関数は、与えられた確率から対応する 値を求めるときに使う。統計的仮説検定や信頼区間の計算で役立つ。












