はじめに
円周率の近似値を算出する方法は複数ある。計算効率が良いものだと、無限級数の近似値を算出する方法がある。
最も、円周率の近似値を簡単に算出する方法は、単位円に内接する正多角形と単位円に外接する正多角形の周の長さと円周の長さを不等式で比較する方法である。
そこで、今回は前半になぜそのような方法で、円周率の近似値が算出できるのか極限の考え方を用いて説明する。
後半では、計算機を用いて円周率の近似値を算出する。
具体的には、三角関数の半角の公式を用いて正多角形の周の長さを計算していく。
以下、単位円に内接・外接する正多角形のイメージである。具体的な多角形として8角形をイメージした。
また、計算結果の概要は以下のようになった。
正多角形の周の長さについて
単位円に内接・外接する正多角形の周の長さを求める。
以下、正$n$角形で考える。
内接正多角形
1辺の長さは、$2\sin{\frac{\theta}{2}}$で与えられる。
ただし、$\theta =\frac{2\pi }{n}$である。
したがって、周の長さ$l_n$は以下のように与えられる。
l_n = 2n\sin{\frac{2\pi}{n}}
外接正多角形
内接正多角形と相似であることを考慮すると、外接正多角形の周の長さは以下のように与えられる。
L_n=\frac{1}{\cos{\frac{\pi}{n}}}l_n
極限を用いた考察
前提
さて、上2つの式について$n\to \infty$にした場合を考える。
以下の有名事実を用いる。
\lim_{\theta\to 0}\frac{\sin\theta}{\theta}=1
ただし、循環論法にならないように、幾何学的な考察以外で証明できたとする。
内接正多角形の場合
\lim_{n\to \infty}l_n = \lim_{n\to \infty}(2n\sin{\frac{2\pi}{n}})=2\pi \lim_{n\to \infty}(\frac{\sin{\frac{2\pi}{n}}}{\frac{2\pi}{n}})=2\pi
つまり、単位円に内接する正多角形の周の長さの半分は、$n$を増やすと円周率に漸近する。
外接正多角形の場合
L_n=\frac{1}{\cos{\frac{\pi}{n}}}l_n
において、$\frac{1}{\cos{\frac{\pi}{n}}}$は$n$を大きくすれば、$1$に漸近することは、余弦の性質上明らかである。
したがって、
\lim_{n\to \infty} L_n= 2\pi
つまり、単位円に外接する正多角形の周の長さの半分は、$n$を増やすと円周率に漸近する。
プログラム
さて、上記の考察より円周率の近似値を算出すべく、『多角形描写用プログラム』と『円周率の近似値計算用プログラム』の2つのプログラムを作成した。
多角形描写用
以下のようなプログラムを作成した。
例として、$2^3=8$角形を考える。
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
n=100
theta_ary=np.linspace(0,2*math.pi,n)
k=3
m=2**k
# 内接する正多角形
x_ary=[]
y_ary=[]
for i in range(m):
x_ary.append(math.cos(2*math.pi*i/m))
y_ary.append(math.sin(2*math.pi*i/m))
x_ary.append(1)
y_ary.append(0)
# 外接する正多角形
x1_ary=[]
y1_ary=[]
l=1/math.cos(math.pi/m)
for i in range(m):
x1_ary.append(l*math.cos(2*math.pi*i/m))
y1_ary.append(l*math.sin(2*math.pi*i/m))
x1_ary.append(l)
y1_ary.append(0)
plt.axes().set_aspect("equal")
plt.plot(x_ary,y_ary,color="blue",label="内接する正多角形")
plt.plot(x1_ary,y1_ary,color="red",label="外接する正多角形")
plt.plot(np.cos(theta_ary),np.sin(theta_ary),color="black",label="単位円")
plt.savefig("単位円と接する多角形の関係性.png")
plt.show()
たしかに、(内接する正多角形の周)<(円周)<(外接する正多角形の周)であることが視覚的に理解できる。
円周率の近似値計算用
正六角形を起点として、倍々に$n$を増やしていく。つまり、
正$6\cdot 2^k$角形を考える。ただし、$k$は0以上の整数である。
以下、内接する正多角形で考える。
l_n = 2n\sin{\frac{2\pi}{n}}
の計算で一番重要なのは、$正弦$の値をどのように算出するかである。
$0\le \alpha \le \frac{\pi}{2}$では、以下の式(半角の公式)が成立する。
\sin{\frac{\alpha}{2}}=\sqrt\frac{1-\cos{\alpha}}{2}
これをもとにして、計算をしていく。
ただし、
\sin{\frac{\pi}{3}}=\frac{\sqrt{3}}{2}
は既知のものとする。
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
k=5
l_ary=[]
s_ary=[]
m_ary=[]
pi_in=[]
pi_out=[]
def half(s):
c=(1-s**2)**0.5
s_half=((1-c)/2)**0.5
return s_half
s=3**0.5/2#60度
m=6
for i in range(k):
l=2*half(s)*m
pi_in.append(l/2)
L=l/(1-(half(s))**2)**0.5
pi_out.append(L/2)
s_ary.append(s)
m_ary.append(m)
s=half(s)
m=m*2
plt.gca().set_xscale("log")
plt.xlabel("正n角形のnの値")
plt.ylabel("円周率の近似値")
plt.plot(m_ary,[(math.pi)]*k,'--',label="円周率")
plt.plot(m_ary,pi_in,color="blue",label="内接する正多角形")
plt.plot(m_ary,pi_out,color="red",label="外接する正多角形")
plt.legend()
plt.savefig("円周率の近似値の推定_正多角形.png")
plt.show()
結果は以下のようになる。
横軸は、対数目盛とした。
このように、$n$を倍々に増加させるにつれ、
(内接する正多角形の周)<(円周)<(外接する正多角形の周)
で上手く挟みこめていて、範囲も狭まっていることが分かる。
ただし、収束はそこまで早くはないようである。
まとめ
今回は、幾何的に円周率の近似値を求める手法について紹介した。
この方法を背景とした問題は2003年の東大入試にも出題された。
正多角形の周の長さで攻めるか、面積で攻めるか意見が分かれそうである。
ただ、このような思考は数学を暗記科目ととらえているとなかなかできない。
一度、教科書等を見ずに自分の頭で悩みながらペンを動かす練習をするのも良いかもしれない。
参考文献


