1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

楕円の周の長さの近似計算について

1
Posted at

はじめに

楕円の周の長さを厳密に求めるのは難しい。
円の周の長さの場合、三角関数の相互関係の性質を使い単純な式で表すことができる。
しかし、楕円の周の長さは、楕円積分関数を用いる必要がある。
そこで、今回は近似解としてラマヌジャンの第1近似式と数値積分解を比較し、それらの妥当性を考察する。

楕円の一部の周を折線で近似.png

楕円周長の近似式と数値積分の比較.png

問題設定

$a>0,b>0$とする。

楕円

\frac{x^2}{a^2}+\frac{y^2}{b^2}=1

の周の長さ$L$の近似値を$a,b$を用いて表現することができるか?

ただし、$x>0,y>0$の対称性を用いるものとする。

考察

以下のような楕円の一部を考える。

楕円の一部の周を折線で近似.png

この楕円の周を折線で近似すると、以下のようになる。

L=4 \sum_{i=1}^{n-1}\sqrt{(x_{i+1}-x_{i})^2+(y_{i+1}-y_{i})^2}

ただし、$n$は分割数で十分に大きな自然数であるとする。

また、

y_i=\frac{b}{a}\sqrt{a^2-x_i^2}

また、$x_{i+1}-x_{i}=h$という微少量を用いる。

この条件で数値計算用のプログラムを作成する。

近似式

ラマヌジャンの第1近似式を用いると、楕円の周の長さの近似値が初等関数で表すことができる。

つまり、

L_{near}=\pi [3(a+b)-\sqrt{(3a+b)(a+3b)}]

そこで、$L,L_{near}$を比較するプログラムを以下のように作成した。

プログラム

周の長さ

python elisp_l.py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import japanize_matplotlib
import math
n=100


def dl(a,b,x):
    h=a/(n-1)
    y=b/a*((a**2-x**2)**0.5)
    y1=b/a*((a**2-(x+h)**2)**0.5)
    return (h**2+(y1-y)**2)**0.5

def elipse_l(a,b):
    x_ary=np.linspace(0,a,n)
    l=0
    for i in range(n-1):
        l+=4*dl(a,b,x_ary[i])
    return l

m=100
a_ary=np.random.uniform(0.5,1.5,m)
b_ary=np.random.uniform(0.5,1.5,m)
#ラマヌジャンの第1近似式(実用で最も一般的)

l_near=math.pi*(3*(a_ary+b_ary)-((3*a_ary+b_ary)*(a_ary+3*b_ary))**0.5)  
l_ary=np.zeros(m)
for k in range(m):
    l_ary[k]=elipse_l(a_ary[k],b_ary[k])

plt.figure(figsize=(8, 4))
plt.scatter(l_near,l_ary)
plt.xlabel("ラマヌジャンの第1近似式による楕円周長",fontsize=14)
plt.ylabel("数値積分による楕円周長",fontsize=14)
plt.title("楕円周長の近似式と数値積分の比較",fontsize=16)
plt.grid()
plt.savefig("楕円周長の近似式と数値積分の比較.png", dpi=200) 
plt.show() 

描写用

python elisp_gra.py
#y=b/a*((a**2-(x+h)**2)**0.5)の楕円の一部の周を折線で近似する

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import japanize_matplotlib
import math
n=5
m=100

a=1
b=2

x_n=np.linspace(0,a,n)
y_n=b/a*((a**2-x_n**2)**0.5)

x_m=np.linspace(0,a,m)
y_m=b/a*((a**2-x_m**2)**0.5)

plt.figure(figsize=(8, 4))
plt.plot(x_m,y_m,label="楕円の一部",color="blue")
plt.plot(x_n,y_n,label="折線近似",color="red")
plt.xlabel("x",fontsize=14)
plt.ylabel("y",fontsize=14)
plt.title("楕円の一部の周を折線で近似",fontsize=16)
plt.grid()
plt.legend()
plt.savefig("楕円の一部の周を折線で近似.png", dpi=200) 
plt.show()

結果

以下のグラフのように、ほぼ$y=x$上にプロットされていることから、数値解と近似解はほぼ等しいといえる。

楕円周長の近似式と数値積分の比較.png

だからといって、それらが厳密解と近いかと言われると断言はできない。その議論は、楕円積分関数を用いた議論となるので、今回は省略する。

まとめ

楕円は、身近な図形である。だが、周の長さを厳密に表現するためには楕円積分関数を用いる必要性がでてくる。これは、人間が用いる『数学』という言語の中でも特殊関数という高級な概念を適用するしかない。したがって、今回は、近似解や数値解で『お遊び』をしてみた。

1
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?