python入門: 10. 数列の和
1から10までの整数の和を求めてみよう。まず, numpyをインポートする:
import numpy as np
次に, 1から10までの整数を格納したnumpy.ndarrayインスタンスを作る。それにはこうするのだ:
np.arange(1,11) (結果はどうなった?)
すると, array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])と出てくるだろう。np.arange()は前回for文を学んだ時に出てきたrange()と似ていて, 最初と最後(+1)の値を指定すると, 連続する数値をずらっと並べてくれる。この和を求めるにはこうすればよい:
np.arange(1,11).sum()
すると55と出てくる。この.sum()は, numpy.ndarrayのメソッドのひとつであり, 要素を全部たして結果を返す, という操作をしてくれる。ちなみにこの処理は,
np.array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).sum()
と同じだということはわかるだろうか?
では, 1から10までの各整数の2乗の和を求めるにはどうすればよいだろう? まず, 「1から10までの各整数の2乗」はのようにできるはずだ:
np.arange(1,11)**2 (結果はどうなった?)
そして, その和はこのようにやれば求まるはずだ:
(np.arange(1,11)**2).sum() (結果はどうなった?)
この答を, 高校数学で学んだ例の公式: n(n+1)(2n+1)/6の計算結果と比べてみよう。合っているだろうか?
n=10 n*(n+1)*(2*n+1)/6 (結果はどうなった?)
では, これを応用して, 1からnまでの整数の2乗の逆数の和, つまり
1/(1^2)+1/(2^2)+...+1/(n^2)
を求めよう。既に諸君はこれは(π^2)/6=1.644934...に近づくことを知っている(nが十分に大きいとき)。例として, n=1000でやってみよう:
(1/(np.arange(1,1001)**2)).sum()
結果は1.6439...である。それなりに近いではないか。
[レポート課題10-1] これを1000までだけでなく, 10000まで, 1000000までのそれぞれで試してみよ。
さて, この式を利用して, πの近似計算をやってみよう。まず,
1/(1^2) + 1/(2^2) + ... + 1/(n^2) ≒ (π^2)/6
なので(「ライブ講義 大学1年生のための数学入門」P41 問62),
π ≒ √(6*(1/(1^2)+1/(2^2)+...+1/(n^2))
となるはずだ(ルートは右辺の全体にかかる)。というわけで以下のようにすればよい(n=1000のとき)。
np.sqrt((6/(np.arange(1,1001)**2)).sum()) (結果はどうなった?)
[レポート課題10-2] これを, 1000までだけでなく, 10000まで, 1000000までのそれぞれで試してみよ。
[レポート課題10-3] 初項1, 公比0.5の等比数列の和を, 第10項まで求めるpythonコマンドを作れ。それが高校で習った等比数列の和の公式による結果と一致するか調べよ。
Pythonプログラミングでは, このように, 繰り返しが必要な数値計算をforループのかわりにnumpy.ndarrayを駆使して実装することが多い。そうしなければいけないというわけではないが, 往々にしてその方がスマートである。
Keyword(s):
References:[python入門]