타원궤도, 포물선궤도, 쌍곡선궤도의 케플러 방정식을 이용하여 케플러 문제 (Kepler's problem)를 풀어보았는데(https://pasus.tistory.com/313). 이번에는 범용(universal) 케플러 방정식을 이용하여 케플러 문제를 풀어보도록 하겠다.
범용 케플러 방정식은 다음과 같았다. (https://pasus.tistory.com/310).
여기서
범용변수(universal variable)
식 (2)에서 보듯이 범용변수

우주비행체의 위치벡터와 속도벡터가 시간
[1]
[2] 식 (1)을 이용하여 비행시간
범용 케플러 방정식 (1)은 비선형 방정식이므로 해석적으로 해를 구하기가 어렵기 때문에 수치적인 반복계산법으로 계산해야 한다. 뉴톤-랩슨 방법(Newton-Raphson method)을 이용하기 위해서 식 (1)을 다음과 같은 함수로 놓는다.
여기서
이므로 식 (6)은
식 (5)에서
만약 범용 비행각으로부터 실제 비행각
초기 비행각
다음은
stumpff.m
function [Cz, Sz] = stumpff(z)
% [Cz, Sz] = stumpff(z)
%
% Stumpff functions
% coded by st.watermelon
eps = 1e-8;
if z > eps
Cz = (1- cos(sqrt(z)))/z;
Sz = (sqrt(z) - sin(sqrt(z)))/(sqrt(z))^3;
elseif z < -eps
Cz = (cosh(sqrt(-z))-1)./(-z);
Sz = (sinh(sqrt(-z))-sqrt(-z))/(sqrt(-z))^3;
else
Cz = 1/2;
Sz = 1/6;
end
universal_chi.m
function chi = universal_chi(r0_vec, v0_vec, tof)
% chi = universal_chi(r0_vec, v0_vec, tof)
% given r0_vec, r0_vec and time-of-flight
% compute universal alomaly chi
%
% Input r0_vec: initial position vector in km
% v0_vec: initial velocity vector in km/sec
% tof: time of flight in sec
% Output chi: universal anomaly in sqrt(km)
%
% all in inertial frame
%
% coded by st.watermelon
mu_e=398600; % gravitational parameter km^3/s^2
% step 1: compute r0 and a ---------------
r0 = sqrt(r0_vec'*r0_vec);
v0 = sqrt(v0_vec'*v0_vec);
alpha = 2/r0 - v0^2/mu_e; % alpha = 1/a
% step 2 ----------------------------------
eps = 1e-8;
% compute chi
chi = sqrt(mu_e)*abs(alpha)*tof;
for ii = 1:100
% Stumpff
z = alpha * chi^2;
[Cz, Sz] = stumpff(z);
% Newton-Raphson
f_chi = (r0_vec'*v0_vec)/sqrt(mu_e)*chi^2*Cz ...
+ (1-alpha*r0)*chi^3*Sz + r0*chi - sqrt(mu_e)*tof;
dfdchi = (r0_vec'*v0_vec)/sqrt(mu_e)*chi*(1-alpha*chi^2*Sz) ...
+ (1-alpha*r0)*chi^2*Cz + r0;
chi_next = chi - f_chi/dfdchi;
if abs(chi_next-chi) < eps
break;
else
chi = chi_next;
end
end
만약 우주비행체의 초기 위치벡터
라그랑지 계수는 다음과 같았다 (https://pasus.tistory.com/312).
위치벡터 및 속도벡터와 라그랑지 계수와의 관계식은 다음과 같았다 (https://pasus.tistory.com/311).
계산 순서는 다음과 같다.
[1]
[2]
[3] 식 (13) 으로 라그랑지 계수
[4] 식 (15) 로
[5] 식 (14) 로 라그랑지 계수
[6] 식 (15) 로
다음은 위 알고리즘을 매트랩 코드로 구현한 것이다.
kepler_chi.m
function [r_vec, v_vec] = kepler_chi(r0_vec, v0_vec, tof)
% [r_vec, v_vec] = kepler_chi(r0_vec, v0_vec, tof)
% given r0_vec, r0_vec and time-of-flight
% compute r_vec and v_vec
%
% Input r0_vec: initial position vector in km
% v0_vec: initial velocity vector in km/sec
% tof: time of flight in sec
% Output r_vec: final position vector in km
% v_vec: final velocity vector in km/sec
%
% all in inertial frame
%
% coded by st.watermelon
mu_e=398600; % gravitational parameter km^3/s^2
% step 1 : compute r0 and v0
r0 = sqrt(r0_vec'*r0_vec);
v0 = sqrt(v0_vec'*v0_vec);
alpha = 2/r0 - v0^2/mu_e; % alpha = 1/a
% step 2 : compute chi
chi = universal_chi(r0_vec, v0_vec, tof);
% compute C(z), S(z) and z
z = alpha * chi^2;
[Cz, Sz] = stumpff(z);
% step 3 : Lagrange coefficients f and g
f = 1 - chi^2/r0 * Cz;
g = tof - chi^3/sqrt(mu_e)*Sz;
% step 4 : compute r_vec
r_vec = f*r0_vec + g*v0_vec;
r = sqrt(r_vec'*r_vec);
% step 5 : Lagrange coefficients f_dot and g_dot
f_dot = sqrt(mu_e)/(r*r0) * chi * (z*Sz-1);
g_dot = 1 - chi^2/r*Cz;
v_vec = f_dot*r0_vec + g_dot*v0_vec;
'항공우주 > 우주역학' 카테고리의 다른 글
램버트 문제 (Lambert’s problem)의 해 (0) | 2023.12.10 |
---|---|
램버트 정리 (Lambert’s theorem) (0) | 2023.12.06 |
케플러 문제 (Kepler’s problem) - 4 (0) | 2023.12.01 |
라그랑지 계수 (Lagrange coefficients) - 2 (0) | 2023.11.30 |
라그랑지 계수 (Lagrange coefficients) - 1 (0) | 2023.11.27 |
댓글