본문 바로가기
항공우주/우주역학

케플러 문제 (Kepler’s problem) - 5

by 깊은대학 2023. 12. 2.

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

범용 케플러 방정식은 다음과 같았다. (https://pasus.tistory.com/310).

 

(1)μ(tt0)=S(z)χ3+r0v0μχ2C(z)+r0χ(1zS(z))

 

여기서 z=χ2a 이다.

범용변수(universal variable) χ 와 타원궤도의 이심 비행각 E, 포물선궤도의 실제 비행각 θ, 그리고 쌍곡선궤도의 이심 비행각 F 와의 관계식은 다음과 같다.

 

(2)χ=a(EE0)χ=hμ(tanθ2tanθ02)χ=a(FF0)

 

식 (2)에서 보듯이 범용변수 χ 는 각 궤도의 이심 비행각과 연결되어 있기 때문에 범용 '비행각' (universal anomaly)라고도 한다. 참고로 χ 의 단위는 km 이다.

 

 

우주비행체의 위치벡터와 속도벡터가 시간 t=t0 에서 r0,v0 로 주어졌을 때, 비행시간이 tt0 만큼 경과한 후의 범용 비행각 χ 는 다음과 같은 순서로 계산할 수 있다.

[1] r0v0 로부터 r0 와 장반경 a 를 계산한다. 여기서 포물선궤도의 경우 a= 이기 때문에 장반경 a 의 역수인 α=1a 를 사용하는 것이 편리하다.
[2] 식 (1)을 이용하여 비행시간 tt0 에 대응하는 χ 를 계산한다.

범용 케플러 방정식 (1)은 비선형 방정식이므로 해석적으로 해를 구하기가 어렵기 때문에 수치적인 반복계산법으로 계산해야 한다. 뉴톤-랩슨 방법(Newton-Raphson method)을 이용하기 위해서 식 (1)을 다음과 같은 함수로 놓는다.

 

(3)f(χ)=S(z)χ3+r0v0μχ2C(z)       +r0χ(1zS(z))μ(tt0)

 

z=χ2a=αχ2 의 관계식을 이용하면 위 식을 다음과 같이 쓸 수 있다.

 

(4)f(χ)=S(z)χ3+r0v0μχ2C(z)     +r0χ(1αχ2S(z))μ(tt0)=r0v0μχ2C(z)+(1αr0)χ3S(z)+r0χμ(tt0)

 

|χi+1χi|<ϵ 의 조건이 수렴할 때까지 다음식을 반복하여 업데이트 하기 위해서는

 

(5)χi+1=χif(χi)f(χi)

 

f(χi) 을 계산해야 한다. f(χi) 는 다음과 같이 계산할 수 있다.

 

(6)f(χ)dχ=2r0v0μχC(z)+r0v0μχ2dC(z)dzdzdχ  +3(1αr0)χ2S(z)+(1αr0)χ3dS(z)dzdzdχ+r0

 

여기서

 

(7)dzdχ=2αχ(8)dC(z)dz=1z2z(12z)sinzcoszz2=1z2(1+z2sinz+cosz)=1z2(1+z2(z(z)3S(z))+(1zC(z)))=12z(1zS(z)2C(z))(9)dS(z)dz=1z2(z)3cosz(12z)(32z)sinzz3=1z3(zz2cosz+32zsinz)=1z3(zz2(1zC(z))+32z(z(z)3S(z)))=12z(C(z)3S(z))

 

이므로 식 (6)은 z=αχ2 임을 이용하면 다음과 같이 쓸 수 있다.

 

(10)f(χ)dχ=2r0v0μχC(z)     +r0v0μχ2(12αχ2(1αχ2S(z)2C(z)))2αχ     +3(1αr0)χ2S(z)     +(1αr0)χ3(12αχ2(C(z)3S(z)))2αχ+r0=r0v0μχ(1αχ2S(z))+(1αr0)χ2C(z)+r0

 

식 (5)에서 χ 의 초기값을 χ0=μ|α|(tt0) 로 하는 것이 일반적이다.

 

 

만약 범용 비행각으로부터 실제 비행각 θ 를 계산하고자 한다면, α 또는 a 로 궤도의 모양을 판단하여 식 (2)로 궤도의 이심 비행각의 변화량을 계산해야 한다. 그런 후 다음 관계식을 이용하여 θ 를 계산하면 된다.

 

(11)tanE2=1e1+etanθ2tanhF2=e1e+1tanθ2

 

α 는 다음과 같이 에너지 방정식으로부터 유도할 수 있다.

 

(12)α=1a=2r0v02μ

 

α>0 이면 타원궤도, α=0 이면 포물선궤도, α<0 이면 쌍곡선궤도이다.

초기 비행각 θ0r0v0 를 이용하여 계산할 수 있다.

다음은 χ 의 계산 과정을 매트랩 코드로 구현한 것이다.

 

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

 

 

 

만약 우주비행체의 초기 위치벡터 r0 와 속도벡터 v0 가 주어졌을 때, 비행시간이 tt0 만큼 변화한 후의 위치벡터와 속도벡터 r,v 를 구하고자 한다면 범용변수와 라그랑지 계수(Lagrange coefficients)와의 관계식을 이용하면 된다.

라그랑지 계수는 다음과 같았다 (https://pasus.tistory.com/312).

 

(13)f=1χ2r0C(z)g=(tt0)χ3μS(z)(14)f˙=μrr0χ(zS(z)1)g˙=1χ2rC(z)

 

위치벡터 및 속도벡터와 라그랑지 계수와의 관계식은 다음과 같았다 (https://pasus.tistory.com/311).

 

(15)r=fr0+gv0v=f˙r0+g˙v0

 

계산 순서는 다음과 같다.

[1] r0v0 로부터 r0 와 장반경 a 를 계산한다.
[2] tt0 로부터 범용변수 χ 를 계산한다.
[3] 식 (13) 으로 라그랑지 계수 f,g 를 계산한다.
[4] 식 (15) 로 r 를 계산한다. 그리고 r 의 크기인 r 도 계산한다.
[5] 식 (14) 로 라그랑지 계수 f˙,g˙ 를 계산한다.
[6] 식 (15) 로 v 를 계산한다.

다음은 위 알고리즘을 매트랩 코드로 구현한 것이다.

 

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;