このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
二項係数の厳密な計算
この例では、Symbolic Math Toolbox™ を使用して二項係数の正確な値を取得し、コイン投げ実験における確率を求める方法を説明します。
シンボリック関数 P(n,k)
を定義します。これは n
回投げた中で厳密に k
回表が出る確率を計算します。
syms P(n,k)
P(n,k) = nchoosek(n,k)/2^n
P(n, k) =
コインを 2000 回投げるとします。投げた回数の 2 分の 1 で表が出る確率は P(n, n/2)
となります。ここでは、n = 2000
です。結果は分子と分母ともに大数の有理式となります。Symbolic Math Toolbox は厳密な結果を返します。
n = 2000; central = P(n, n/2)
central =
digits
と vpa
を使用して 10 桁の精度でこの有理数を近似します。
previous_digits = digits(10); vpa(central)
ans =
"表" の回数と期待値との差が 2 標準偏差以内となる確率を計算します。
sigma = sqrt(n/4); withinTwoSigma = symsum(P(n, k), k, ceil(n/2 - 2*sigma), floor(n/2 + 2*sigma))
withinTwoSigma =
結果を浮動小数点数で近似します。
vpa(withinTwoSigma)
ans =
この結果を正規分布の累積分布関数 (cdf) から導出した以下の 2 つの推定値と比較します。2 シグマ区間の外側にある最初の整数と区間の内側にある最初の整数との中点をとると、2 シグマ区間それ自体を使用するよりも精度の高い結果が得られることがわかります。
syms cdf(x)
cdf(x) = 1/2 * (1 + erf((x - n/2)/sqrt(sym(n/2))))
cdf(x) =
estimate1 = vpa(cdf(n/2 + 2*sigma) - cdf(n/2 - 2*sigma))
estimate1 =
estimate2 = vpa(cdf(floor(n/2 + 2*sigma) + 1/2) - ...
cdf(ceil(n/2 - 2*sigma) - 1/2))
estimate2 =
error1 = vpa(estimate1 - withinTwoSigma)
error1 =
error2 = vpa(estimate2 - withinTwoSigma)
error2 =
既定の精度に戻して浮動小数点計算を続けます。
digits(previous_digits);
区間内の k の分布をプロットします。プロットはガウス曲線になります。
k = n/2 + (-2*sigma:2*sigma); plot(k, P(n,k), '-+'); title('2000 coin tosses'); xlabel('Number of heads'); ylabel('Probability');