시험 시작 전, 다음의 ’학생 명예선서(Honor Code)’를 아래에 옮겨 적고 학번과 이름을 적어 서명하시오.
학생 명예선서:
“나는 타인의 도움을 받지 않고 정직하게 시험에 응할 것을 서약합니다.”
“By signing this pledge, I promise to adhere to exam requirements and maintain the highest level of ethical principles during the exam period.”
학생 명예선서:
학번:
이름:
(Problem 1) 다음과 같이 수열 $a_n$, $b_n$, $t_n$, $p_n$을 ($n=0,1,2,\dots$) 사용하는 알고리듬을 통해, 원주율 $\pi$를 수치적으로 계산해 보려고 한다.
참고로, $a_{n+1}$과 $b_{n+1}$은 각각 직전 단계에서의 $a_n$과 $b_n$의 산술 평균과 기하 평균이므로, 반복을 거듭할 수록 $a_n$과 $b_n$은 서로 접근하게 된다.
(P1-a) 위의 알고리듬을 구현하여 소숫점 열 자리 이상의 정확도를 갖는 $\pi$의 근사값을 구하시오. 이 정도의 정확도는 몇 번의 반복 연산을 통해 얻어지는가? 다시 말해, 위의 알고리듬은 $n$이 얼마일 때 종료되는가?
# your code here
n = 0
a, b, t, p = 1, 1/(2**0.5), 1/4, 1
pi = (a+b)**2/4/t
err = 1000
history = []
while err >= 1e-15:
print (f'n: {n} pi: {pi:20.14f}')
history.append([a,b,t,p,pi])
pi_old = pi
a, b, t, p = (a+b)/2, (a*b)**0.5, t - p*(a-b)**2/4, 2*p
pi = (a+b)**2/4/t
err = abs(pi-pi_old)
n += 1
n: 0 pi: 2.91421356237309 n: 1 pi: 3.14057925052217 n: 2 pi: 3.14159264621354 n: 3 pi: 3.14159265358979
(P1-b) 위의 결과에서서 $\pi_n$의 수렴 과정을 그래프를 통해 확인하시오. 마찬가지로 $a_n$과 $b_n$의 그래프를 통해 $a_n$과 $b_n$이 서로 가까워짐을 확인하시오.
# your code here
import numpy as np
import matplotlib.pyplot as plt
history = np.array(history)
plt.figure(figsize=(10,5), dpi=100)
plt.plot(history[:,4], label=r'$\pi_n$')
plt.legend()
plt.grid()
plt.xlabel('iteration')
plt.ylabel(r'$\pi_n$')
plt.show()
plt.figure(figsize=(10,5), dpi=100)
plt.plot(history[:,0], label=r'$a_n$')
plt.plot(history[:,1], label=r'$b_n$')
plt.legend()
plt.grid()
plt.xlabel('iteration')
plt.ylabel(r'$a_n$ and $b_n$')
plt.show()
(Problem 2) 어떤 인공위성이 우주발사체에 실려 발사되었고, 발사체 추진기관의 연소가 모두 종료된 후 위성이 분리되었다. 이 때, 위성은 적도 상공 고도 $h_0=800\,\text{km}$에 위치해 있었고, 속도는 정북 방향으로 $v_0=9\,\text{km/s}$로 수평에서 $\beta_0 = \frac{\pi}{18}\,\text{rad}(=10 \deg) $ 윗 방향을 향하고 있었다고 한다. 아래 그림의 녹색 화살표를 참고하시오.
이 문제에서는 이 인공위성의 궤도를 그려보고 다양한 초기 속도 변화에 대한 궤도 형태를 분석하려고 한다. 인공위성의 운동이 위 그림의 $x-y$ 평면 상에서만 일어난다고 가정하면, 인공위성의 궤적은 변수 $r$과 $\theta$를 사용하여 다음과 같이 표현할 수 있다.
$$ r = \frac{p^2/\mu}{1+\epsilon \cos (\theta-C)}\\ $$여기에서 $r$과 $\theta$는 인공위성의 위치를 표현하는 변수들로, $r$은 지구 중심으로부터의 거리, $\theta$는 적도 방향으로부터의 각 변위(위도)를 의미한다. $r$의 단위는 미터, $\theta$의 단위는 라디안이다. 그 외의 다른 변수들은 모두 고정된 상수로, 다음에 간략히 설명되어 있다.
주의: 위의 모든 수식에서 거리의 단위는 m, 속도의 단위는 m/s, 각도의 단위는 rad을 사용해야 한다.
(P2-a) 단위 질량당 각 운동량 $p$, 이심율 $\epsilon$, 그리고 위상각 $C$를 계산하여 출력하시오.
# your code here
import numpy as np
import matplotlib.pyplot as plt
mu = 3.986e14
RE = 6400000
h0 = 800000
r0 = RE + h0
beta0 = np.pi/18
v0 = 9000
p = r0*v0*np.cos(beta0)
q = v0**2/2 - mu/r0
epsilon = np.sqrt( 1 + 2*p**2*q/mu**2 )
C = -np.arccos( p**2/r0/mu/epsilon - 1/epsilon )
print(f'p: {p}')
print(f'epsilon: {epsilon}')
print(f'C: {C}')
p: 63815542395.19108 epsilon: 0.4880238579789183 C: -0.5383232357263534
(P2-b) 이 인공위성의 궤도를 그리시오 (힌트: $0\le\theta\le 2\pi$ 범위의 $\theta$에 대해 $r$을 계산한 후 $(x,y)=(r\cos\theta, r\sin\theta)$의 자취를 평면 상에 도시하여 얻을 수 있음). 지구를 반지름 6400km의 원으로 함께 표시하고, 이 인공위성의 궤도가 원형/타원형/포물선/쌍곡선 중 어뗘한 형태인지 확인하시오. 참고로 plt.axis('equal') 명령을 통해 그래프의 x축과 y축 스케일을 동일하게 도시할 수 있다.
# your code here
theta = np.linspace(0, 2*np.pi, 1000)
r = p**2/mu/(1+epsilon*np.cos(theta-C))
plt.figure(figsize=(10,10), dpi=100)
plt.plot(0, 0, 'x', markersize=10, label='Earth\'s center')
plt.plot(6400*np.cos(theta), 6400*np.sin(theta), label='Earth\'s surface')
plt.plot(r*np.cos(theta)/1000, r*np.sin(theta)/1000, label='Satellite\'s trajectory')
plt.xlabel(r'$x$ position (km)')
plt.ylabel(r'$y$ position (km)')
plt.axis('equal')
plt.legend()
plt.grid()
plt.show()
(P2-c) 이 인공위성의 궤적에서, 인공위성이 지구와 가장 멀리 떨어졌을 때와 가장 가까울 때의 고도는 몇 km인가?
# your code here
hmax = np.max(r) - RE
hmin = np.min(r) - RE
print(f'maximum h: {hmax/1000}(km)')
print(f'minimum h: {hmin/1000}(km)')
maximum h: 13555.648420059093(km) minimum h: 466.0381444595661(km)
(P2-d) 2021년 10월의 누리호 발사과정에서, 3단 로켓의 연소가 조기 종료됨으로 인해 목표했던 연소 종료 속도 $v_0$가 얻어지지 못한 문제가 발생하였고, 이에 따라 더미 위성이 목표 궤도를 형성하지 못한채 지구로 추락할 것으로 예측되었다. 위에서 여러분이 만든 코드를 활용해서, 다양한 초기 속도 $v_0$에 대해 인공위성의 궤도가 어떻게 변화하는지 살펴 보고, 연소 종료 속도 $v_0$가 몇 km/s 이하일 때 위성이 지표면으로 추락할 것인지 계산해 보시오 (정확히 계산할 필요는 없으며, 유효숫자 두세자리 정도까지의 정확도로 답하시오). 목표 고도 $h_0$와 진입각 $\beta_0$는 예상대로 ($h_0=800\,\text{km}$, $\beta_0=10\,\text{deg}$)달성되었고, 목표 속도만이 미달되었다고 가정한다.
# your code here
import numpy as np
import matplotlib.pyplot as plt
v0_test = np.arange(9000, 0, -10)
for v0 in v0_test:
p = r0*v0*np.cos(beta0)
q = v0**2/2 - mu/r0
epsilon = np.sqrt( 1 + 2*p**2*q/mu**2 )
C = -np.arccos( p**2/r0/mu/epsilon - 1/epsilon )
theta = np.linspace(0, 2*np.pi, 1000)
r = p**2/mu/(1+epsilon*np.cos(theta-C))
if np.min(r) <= 6400e3:
break
print(f'minimum v_0: {v0} (m/s)')
print(f'minimum r: {np.min(r)/1000} (km)')
plt.figure(figsize=(10,10), dpi=100)
plt.plot(0, 0, 'x', markersize=10, label='Earth\'s center')
plt.plot(6400*np.cos(theta), 6400*np.sin(theta), label='Earth\'s surface')
plt.plot(r*np.cos(theta)/1000, r*np.sin(theta)/1000, label='Satellite\'s trajectory')
plt.xlabel(r'$x$ position (km)')
plt.ylabel(r'$y$ position (km)')
plt.axis('equal')
plt.legend()
plt.grid()
plt.show()
minimum v_0: 7800 (m/s) minimum r: 6399.612134257754 (km)