この記事では、VBA で逆二乗和の収束値を計算し、バーゼル問題に迫ってみます。
【VBA】バーゼル問題に迫ります
次のような形の数列の和(級数)を計算する VBA マクロを作ります。
\[\sum_{k=1}^n k^s=1+2^s+3^s+\: \cdots \:+n^s\]
$s=1$ のとき $1$ から $n$ までの数字の和を計算します:
\[\sum_{k=1}^n k=1+2+3+\: \cdots \:+n\]
$s=2$ のとき $1$ から $n$ までの二乗和を計算します:
\[\sum_{k=1}^n k^2=1+2^2+3^2+\: \cdots \:+n^2\]
$s=-1$ のとき調和数を計算します:
\[\sum_{k=1}^n \frac{1}{k}=1+\frac{1}{2}+\frac{1}{3}+\: \cdots +\: \frac{1}{n}\]
$s=-2$ のとき $1$ から $n$ までの逆二乗和を計算します:
\[\sum_{k=1}^n \frac{1}{k^2}=1+\frac{1}{2^2}+\frac{1}{3^2}+\: \cdots +\: \frac{1}{n^2}\]
このように $s$ に対応して様々な数列の和を計算することができます。級数の部分和を計算しているわけですが、$n$ の値を非常に大きくとることによって無限級数の近似値を得ることができます。このような級数を計算する Function Macro は次のようになります。
'[VBA] 級数を計算するユーザー定義関数 Function SIGMA(s As Double, n As Integer) As Double Dim z As Double, k As Integer For k = 1 To n z = z + k ^ s Next k SIGMA = z End Function
級数関数SIGMAを使って、$1$ から $100$ まで順に加える級数
\[1+2+3++\: \cdots \:+99+100\]
を計算させてみましょう。セルに
=SIGMA(1,100)
と入力してください。5050 が返るはずです。
さて、$s = -2,\ n \rightarrow \infty$ とした逆二乗和
\[\sum_{k=1}^{\infty} \frac{1}{k^2}\]
の収束値を求める問題をバーゼル問題と呼びますが、大数学者のオイラーによって
\[\sum_{k=1}^{\infty} \frac{1}{k^2}=\frac{\pi^2}{6}\]
であることが証明されています。SIGMA関数でどこまでこの値に迫れるか試してみましょう。エクセルのシート上で SIGMA(-2,n) の値を計算させると、
SIGMA(-2,10000) = 1.64483 SIGMA(-2,20000) = 1.64488 SIGMA(-2,30000) = 1.64490
のようになります。真値は 1.64493… ですから、まずまずの精度ですね。
エクセルや数学に関するコメントをお寄せください