いろは2986023 views
高校国語785655 views
高校倫理1433119 views
高校化学2913383 views
教育148875 views
英語607877 views
中学理科1626207 views
雑学1472593 views
りんご192546 views
中学数学621382 views
Help
Tools

English

誤差関数と相補誤差関数(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(より正確)
math.erf(x)

誤差関数。 に近づく。

math.erfc(x)

相補誤差関数。 を精度よく計算する。大きな で有用。

正規分布との関係

標準正規分布の累積分布関数 は誤差関数で表現できる。

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

逆誤差関数は、与えられた確率から対応する 値を求めるときに使う。統計的仮説検定や信頼区間の計算で役立つ。