Mímisbrunnr知恵の泉

← シミュレーション 一覧

🎓 レベル:発展 | 重要度:B(推奨)

📎 前提:収束率と誤差(√n則) | 関連:擬似乱数(線形合同法・メルセンヌツイスタ)

要点(BLUF)

1. アイデア:ランダムをやめて均等に敷く

モンテカルロの誤差 σ/n\sigma/\sqrt{n} は、乱数点の配置にムラ(かたまりと隙間)があることに由来します。だったら、最初からできるだけ均等に点を配置すればいい——これが準モンテカルロの発想です。

ただし格子(等間隔)は次元の呪い(NdN^d)に陥るので、代わりに低食い違い列を使います。これは「どの部分区間を見ても、点の割合がその区間の体積にほぼ比例する」ように決定的に作られた点列で、ランダムより遥かに均等です。代表が Sobol 列Halton 列

2. 食い違い(discrepancy)と収束

一様性の尺度がスター食い違い Dn\*D_n^\* です。点集合 {xi}\{x_i\} について、原点を角とする任意の箱 [0,b)[0,b) で「箱に入る点の割合」と「箱の体積」の差の上限:

Dn\*=supb#{xi[0,b)}nvol([0,b))D_n^\* = \sup_{b}\left| \frac{\#\{x_i \in [0,b)\}}{n} - \text{vol}([0,b)) \right|

Koksma–Hlawka の不等式が積分誤差を食い違いで抑えます:

I^nIV(g)Dn\*\left| \hat{I}_n - I \right| \le V(g)\, D_n^\*

ここで V(g)V(g) は被積分関数の変動(Hardy–Krause 変動)。ランダム点の食い違いは O(n1/2)O(n^{-1/2}) ですが、低食い違い列は O((logn)d/n)O((\log n)^d / n)ほぼ 1/n1/n なので、1/n1/\sqrt{n} より圧倒的に速い。ただし次元 dd が高いと (logn)d(\log n)^d が効き始め、優位は薄れます。

3. 実測:Sobol 列 vs 素朴MC

import numpy as np
from scipy.stats import qmc

# 乱数シードを固定
rng = np.random.default_rng(34)
true = np.e - 1

for m in [8, 10, 12, 14, 16]:
    n = 2**m
    sobol = qmc.Sobol(d=1, scramble=True, seed=rng)   # スクランブル付きSobol列
    pts = sobol.random(n).ravel()
    qmc_est = np.exp(pts).mean()
    mc_est = np.exp(rng.random(n)).mean()             # 同じ点数の素朴MC
    print(f"n=2^{m}={n:>6}: QMC誤差={abs(qmc_est-true):.2e}  MC誤差={abs(mc_est-true):.2e}")

出力:

n=2^8=   256: QMC誤差=1.22e-07  MC誤差=2.40e-02
n=2^10=  1024: QMC誤差=3.14e-09  MC誤差=1.08e-02
n=2^12=  4096: QMC誤差=8.00e-10  MC誤差=4.89e-03
n=2^14= 16384: QMC誤差=8.00e-10  MC誤差=5.25e-03
n=2^16= 65536: QMC誤差=8.00e-10  MC誤差=1.71e-03

出力の意味:1次元のなめらかな被積分関数では、Sobol 列の誤差が素朴MCより5〜7桁小さい。n=256n=256 ですでに QMC は 10710^{-7}、MC は 10210^{-2}。QMC は点数を増やすと急速に誤差が落ち(ほぼ 1/n1/n)、n=212n=2^{12} 以降は浮動小数点の限界(1010\sim 10^{-10})に達しています。点を「賢く均等に」置くだけで、これだけ違う。低次元・なめらか・高精度が欲しい積分では QMC が圧倒的です。

4. スクランブルと使いどころ

数式の直観的意味

準モンテカルロは「運に頼らず、定義域を几帳面に塗りつぶす」操作です。1/n1/\sqrt{n}\sqrt{} は「独立な乱数のムラが完全には消えない」ことの代償でしたが、QMC は最初からムラを作らないので、その代償を払わずに済む——だから 1/n1/n に近づく。Koksma–Hlawka の不等式は「積分誤差 ≤ 関数の暴れ具合 × 点配置のムラ」と読め、点配置のムラ(食い違い)を設計で潰せば誤差が直接縮む、と教えます。一方 (logn)d(\log n)^d が次元とともに膨らむのは、「高次元では『均等に塗る』こと自体が難しくなる」ことの数学的表現。低次元でこそ真価を発揮する理由です。

⚠️ よくある誤解・落とし穴

対応シミュレーション参照

本文の Sobol 列 vs 素朴MC の収束比較(default_rng(34)、5〜7桁の差)。

関連ノート