본문 바로가기

파이썬

이심률과 기하학

이심률은 태양계의 행성들의 공전궤도를 구하려할때 필연적으로 만나게되는 주제이다.

이번에는 이심률과 기하학에 대하여 공부한 내용을 정리하고 공유해 보려한다!

이론적인 배경은 간략히...

실제로 이심률과 기하학의 관계가 실제로 그러한 지 컴퓨팅의 힘을 빌려 의구심을 해소해 보려한다.

 

만약 P(x, y), F(0, 0), H(d, y) 일 때 이심률 e = PF / PH 하면,
=> x2 + y2 = e2 * (d - x)2


위 식에 r = √(x2 + y2) , x = r * cosθ 를 대입하여 정리하면,
=> r = (d * e)/(1 + e * cosθ)

 

1. 두 초점 F(-c,0), F'(-c,0)으로 부터의 거리의 합이 2a인 타원의 방정식

    √[(x-c)2+y2] + √[(x+c)2+y2] = 2a     ⇒     (a2-c2)x2 + a2y2 = a2(a2-c2)  ,  a>b>0

    ⇒  x2/a2 + y2/b2 = 1  ,  c2 = a2 - b2

 

2. 초점(-p,0)과 준선 x=p 과의 거리가 같은 포물선의 방정식

    (-x+p)2 = (x+p)2 + y2     ⇒     y2 = -4px

 

3. 두 초점 F(-c,0), F'(-c,0)으로 부터의 거리의 차가 2a인 쌍곡선의 방정식

    √[(x-c)2+y2] - √[(x+c)2+y2] = 2a     ⇒     (a2-c2)x2 + a2y2 = a2(a2-c2)  ,  c>a>0

    ⇒  x2/a2 - y2/b2 = 1  ,  c2 = a2 + b2

 

이심률 e를 변화시킴에 따라 궤적이 원(e=0)에서 타원(e<1), 포물선(e=1), 쌍곡선(e>1)으로 변하는 지

직접확인해 보자^^;

먼저 이를 위한 소스코드이다!

 

import numpy as np
import matplotlib.pyplot as plt

N = 256
th = np.arange(0, 2*np.pi, 2*np.pi/N)
es = [0, 0.5, 1, 1.5, 3]
# if P(x,y), F(0,0), H(d,y) then e = PF / PH -> x**2 + y**2 = e**2(d - x)**2

d = 10

plt.figure()
plt.plot(0, 0, 'x')
plt.text(0, 0, 'Focus')
plt.plot([d, d], [-30, 30], 'r')
plt.text(d, 10, 'directrix d='+str(d))
plt.axis('equal')     #plt.axis('square')
plt.axis([-30, 30, -30, 30])
for e in es :
    l = d*e     # l = u**2/(G*M) , u = r**2*w
    r = l / (1 + e*np.cos(th))    # r = x**2 + y**2 , x = rcos(th)
    if e<1 :     # circle, ellipse
        a = r[0]/(1-e)     # a = (r[0] + r[0]*(1+e)/(1-e))/2
        c = a - r[0]
        b = np.sqrt(a**2 - c**2)     # c**2 = a**2 - b**2
        print('e =', e, 'c =', c, 'a =', a, 'b =', b)
    elif e==1 :     # parabola
        p = d/2
        c = d/2
        print('e =', e, 'c =', c, 'p =', p)
    else :     # hyperbola
        a = -(r[0]/(1-e))     # a = -(r[0]+r[int(N/2)])/2
        c = a + r[0]
        b = np.sqrt(c**2 - a**2)     # c**2 = a**2 + b**2
        m = b/a     # slope = np.tan(np.pi-np.arccos(-1/e))
        print('e =', e, 'a =', a, 'c =', c, 'b =', b, 'slope =', m)
    plt.plot(r*np.cos(th), r*np.sin(th), '.', label=str(e))
    plt.pause(1)

plt.legend(loc='best')

plt.show(0)

 

다음은 실행한 결과 그래프이다!

초점F를 태양으로 보고 각 행성이 특정한 이심률e로 타원궤도 공전하는 모습을 상상하면 신기합니다.ㅎㅎ

 

또 이것을 물리적 의미로 해석해보면, 태양(초점F)에서 적정한 거리 r과 각속도w로 공전하는 행성의 궤도는

원, 타원, 포물선, 쌍곡선이 된다는 것이다!

이것의 증명은 조금 길고 복잡해서,,,

이미 좋은 블로그 내용이 있어 http://zetablog.tistory.com/31?category=609843 으로 대신하려 한다.

 

<심화자료>

1. https://en.wikipedia.org/wiki/Kepler_orbit

2. https://blog.naver.com/jung2381187/220961166542

3. https://blog.naver.com/hooncha10542/222794535539

4. https://boole-sit.tistory.com/60