python

python練習問題 | 円周率を求める2つのプログラム計算

当サイトでは広告が表示される記事があります

円周率は、コンピュータでないと計算できないです。

だから、プログラマーとして一度は円周率に挑戦しましょう。

  • ライプニッツの公式…無限級数を使った計算
  • モンテカルロシミュレーション…乱数を使ったシミュレーション
せんわんこ
せんわんこ

よろしくー

長年授業でやってきたことをまとめて、 ITパスポートの無料Note(1度落ちちゃった方向け) 基本情報技術者対策のNoteを作ってます。興味あったらどーぞ(▼・ω・▼)

ライプニッツの公式

江戸時代の数学者が導いた数式だゾ!

「この式をプログラムで計算してください。絶対知ってる値が出るよ!」

これだけで、プログラムを書いてもらってください。

発見の喜びを体験してもらいましょ。

なんなら、どっかのタイミングで下記を伝えてもOKです。

「1600年代、つまり江戸時代。ドイツの数学者が見つけた公式だよ!」

せんわんこ
せんわんこ

発見の喜びって大事ー

pythonで作ってみましょう

一応、答えのソース書いておきますが、プログラムの組み方(アルゴリズム)は色々あるし、そこが面白いところです。

学生の「円周率じゃん」という「発見」と「(最適解かはともかく)自分なりにプログラム組めた!」という「体験」や「達成感」みたいなものを感じる機会を奪わないであげましょう。

もちろん最終的には答えを見せて、「写しただけだけど、なんかできた」って体験にしてあげてください。

せんわんこ
せんわんこ

初めてできたって大事ー

for文とif文を組み合わせた課題として、「奇数だけを足し合わせろ」みたいなのがあると思います。

同じように、奇数だけを取り出すということを考えてもらっても良いですね。

符号をループ毎に正負反転させるところだけ考えればOKです。

sign = 1
sum  = 0
for i in range(1,1000000,1):
  if i%2 == 1:
    sum = sum + sign*1/i
    if sign == 1:
      sign = -1
    else:
      sign = 1
sum = sum*4
print(sum)

range()の使い方を調べて、1,3,5,7,・・・と2ずつ増やすやり方でもOKですね。

sign = 1
sum  = 0
for i in range(1,1000000,2):
  sum = sum + sign*1/i
  if sign == 1:
    sign = -1
  else:
    sign = 1
sum = sum*4
print(sum)
せんわんこ
せんわんこ

知ってることを
ちょっとずつ増やそー

残念なpython

正負符号について、負は偶数番目の項なので、別途カウンタ変数cntを設けて数を数えるのもアリです。

sum  = 0
cnt  = 0
for i in range(1,1000000,2):
  cnt=cnt+1
  if cnt%2 == 1:
    sign = 1
  else:
    sign = -1
  sum = sum + sign*1/i
sum = sum*4
print(sum)
せんわんこ
せんわんこ

最初はいいんだよー

ただ、pythonでは、enumerate()を使うとカウンタも返してくれます。

ただし、0から数えています。

sum  = 0
for cnt,i in enumerate(range(1,1000000,2)):
  cnt = cnt+1         # カウンタが1から始まるように細工
  if cnt%2 == 1:
    sign = 1
  else:
    sign = -1
  sum = sum + sign*1/i
sum = sum*4
print(sum)

cntが0から始まることを考慮して、if文の条件を変えてもOKですね。

sum  = 0
for cnt,i in enumerate(range(1,1000000,2)):
  if cnt%2 == 0:       # cntが0から始まるため。
    sign = 1
  else:
    sign = -1
  sum = sum + sign*1/i
sum = sum*4
print(sum)

下記の動画が参考になります。03:13ぐらいからです。

私はシステムエンジニア出身ではないので、技術者の方のyoutube動画はとても助かります。

Youtube「Pythonプログラミング VTuber サプー」チャンネル より
せんわんこ
せんわんこ

いつもお世話になっておりますー

モンテカルロ法による導出

モンテカルロ法は、乱数を利用する計算方法です。

国家試験である「ITパスポート」や「基本情報技術者試験」にも出題されます。

素粒子の運動をシミュレーションするために開発された手法で、ウラムって人が考案したとのことです。

せんわんこ
せんわんこ

むずかしそーって思うけど
実は簡単にできちゃうー

ジョン・フォン・ノイマンさん

モンテカルロ法って名前を付けたのは、ジョン・フォン・ノイマンさんです。

モンテカルロさんじゃないんですねw

さて、ジョン・フォン・ノイマンさんを聞いたことがあるならOKです。

20世紀科学史における最重要人物で、いろんな分野で超活躍された方です。

現在のコンピュータも「ノイマン型コンピュータ」と云いますからね。

せんわんこ
せんわんこ

ノイマンさんは知っておこー

pythonで作ってみましょう

円周率を求めますが、面積を使う手法で行きます。

そして面積を「縦×横」みたいな数値計算ではなく、点の数で表します。

点を打つ場所をランダムにします。そこで乱数を使うわけです。

では、pythonで以下を打ち込んで実行してください。円周率でますよ!

import random
cntmax=1000000
cnt2  =0
for i in range(1,cntmax+1):
  x=random.uniform(0,1)
  y=random.uniform(0,1)
  if x**2+y**2 <= 1:
    cnt2=cnt2+1
print(4*cnt2/cntmax)
せんわんこ
せんわんこ

コピペでおっけー

一応説明

えー、どうせ学生は眠くなるので、カットしてもらってOKですw

ほんとに短く説明できるならすれば良いですが、

「プログラムで円周率計算できた。よくわからんけど」って体験だけで充分だと思います。

別のサイト様に丁寧な説明がありますので、ここでは投げやりでw

一度説明したんですけど、寝るんすよ。「メンドイ」とか言われました(キレ気味

  1. 平面の座標(x,y)にランダムに点を落とします。
    • x=0~1、y=0~1とします。
  2. その点の総数は、一辺が1の正方形の面積に相当します。ここではcntmaxが総数です。
  3. 落とした点の座標(x,y)がx**2+y**2<=1を満たす場合は、半径1の1/4円の面積に相当します。ここではcnt2で数えています。
  4. cnt2/cntmax=1/4*πとなります。
    • よって4*cnt2/cntmax=πとして円周率を求めています。
せんわんこ
せんわんこ

めんどくせーって言われてから
二度と教えてないですねー

まとめ | 円周率の歴史

ここまで読んで頂きありがとうございます!

せんわんこ
せんわんこ

ありがとー

円周率を導出した歴史です。

現在は企業のスーパーコンピュータで計算してるでしょうが、

昔は一個人が世界記録を持っていたんですね。

プログラムをかじると、整数型だの単精度実数だの倍精度実数だのでてきますが、

どうやって桁を管理してるんでしょうね。と、考えは絶えません。

せんわんこ
せんわんこ

じゃ またー

タイトルとURLをコピーしました