램버트 문제(Lambert's problem)는 이름에서 알 수 있듯이 18세기 수학자 Johann Heinrich Lambert에 의해 처음 제기된 문제다. 그는 이 문제를 해결하기 위해 램버트의 정리(https://pasus.tistory.com/315)를 고안하였다. 참고로 램버트 정리의 증명은 라그랑지(Lagrange)가 하였고 램버트 문제의 해를 처음으로 구한 사람은 가우스(Gauss)였다.
램버트 문제는 기본적으로 두 지점 사이를 비행하는 데 걸리는 시간이 주어졌을 때, 두 지점 사이를 연결하는 궤도를 찾는 것이다. 수학적으로 램버트 문제는 이체문제(two-body problem)에서 유도된 기본 궤도 미분 방정식에 대한 2점 경계값 문제(TPBVP, two-point boundary value problem)로 표현할 수 있다.
여기서

램버트 문제는 우주비행역학, 우주궤도역학 및 천체역학 분야에서 다루는 근본적인 문제에 관한 것이기 때문에 광범위하게 응용되고 있다. 응용 분야를 3가지 영역에서 정리하면 다음과 같다.
첫째, 위치벡터
둘째, 위치벡터
셋째, 위치벡터
실제로 램버트 문제는 보이저 탐사선을 비롯한 다양한 우주선의 궤도를 계산하는 데 사용되었으며 아폴로가 달 표면에 착륙하는데 유도 알고리즘으로도 사용되었다.
램버트 문제를 풀기 위한 알고리즘은 그동안 여러가지가 제시되어 왔지만, 대부분의 알고리즘은 반복적인 계산 방식을 사용한다. 반복적 계산 알고리즘에서는 특정 궤도에서 두 지점 사이를 비행하는 데 필요한 시간을 계산하고, 이를 주어진 비행시간과 비교한다. 비행시간이 맞지 않으면 궤도를 수정하여 비행시간을 다시 계산하고 이 과정을 비행시간이 일치할 때까지 반복하는 것이다. 다양한 알고리즘이 제시되어 왔음에도 불구하고 이심율이 매우 큰 타원궤도과 쌍곡선궤도, 비행각이 거의 180도에 달하는 경우, 그리고 출발 지점에서 수차례의 궤도 공전 (multiple revolution) 후에 목표지점으로 가는 경우 등에서 계산 상의 문제가 발생하기 때문에 아직 알고리즘이 완벽하다고 할 수는 없다.
램버트 문제를 풀기 위한 알고리즘은 기하학적 해석에 바탕을 둔 방법이 대부분이다. 물론 기하학적 방법외에도 2점 경계값 문제를 직접 푸는 방법도 있다 (https://pasus.tistory.com/297).
램버트 문제는 두 지점의 위치벡터

만약 두 위치벡터가 평행하고 방향이 반대 (

네 개의 벡터
위 식에 의하면
여기서
램버트 문제를 풀기 위한 기하학적 기반 알고리즘의 거의 대부분은 주어진 조건과 라그랑지 계수의 관계에서 파생되었다고 보면 된다. 대표적으로 a-반복법(iteration) 계열, p-반복법 계열, 범용변수(universal variables)를 이용한 방법 등이 있다. 이 외에 램버트 정리 (https://pasus.tistory.com/315)를 이용한 방법 등이 있다. 램버트 정리는 두 지점 사이의 비행시간은 두 지점까지의 거리의 합, 코드길이 그리고 궤도의 장반경
이 중에서 범용변수 방법은 a-반복법이나 p-반복법 보다도 우수하고, 또한 램버트 정리를 이용한 방법에서 처리해야 하는 여러가지 특수한 경우를 피할 수 있기 때문에 많이 사용되고 있는 알고리즘이다. 본 게시글에서는 범용변수를 이용한 램버트 문제의 해를 유도해 보기로 한다.
우선 라그랑지 계수를 실제 비행각(true anomaly)의 변화량
또한 라그랑지 계수는 범용변수 또는 범용 비행각(universal anomaly)
여기서
식 (5)와 (6)에 의하면 라그랑지 계수를 구성하는 변수는 7개로서
식 (6)은 범용변수를 이용하여 라그랑지 계수를 표현했지만, 이심 비행각의 변화량
반복적 풀이 방법의 일반적인 형식은 다음과 같다. 일단 3개의 미지수 중 하나를 선택하여 그 값을 추측한 다음에 나머지 2개의 미지수를 계산한다. 그런 후 선택한 미지수를 뉴톤 방법이나 이분법(bisection method) 등을 사용하여 업데이트 한다. 이 값으로 다시 나머지 미지수 2개를 계산한다. 이런 반복 작업을 미지수가 수렴할 때까지 계속한다.
여기서 반복 작업할 미지수로
식 (5)에서 실제 비행각의 변화량
여기서 arccos 은
위 식을 식 (9)에 대입하면,
가 된다. 위 식의 괄호항은 상수인데. 이를
여기서
양변에
위 식을 정리하면,
이 되므로 결국 다음과 같이
위 식의 오른쪽 항은
로 놓으면, 식 (18)은
가 된다. 그러면 식 (14)는 다음과 같이
따라서
뉴톤-랩슨 방법(Newton-Raphson method)을 이용하기 위해서 식 (21)을 다음과 같은 함수로 놓는다.
여기서
Stumpff 함수의 도함수 (https://pasus.tistory.com/314)를 이용하면,
식 (25)는 다음과 같이 된다.
여기서 Stumpff 함수의 정의,
에 의하면, 식 (27)에서
이 성립하므로 식 (27)의 대괄호항은 다음과 같이 된다.
따라서 y^' (z)은 다음과 같이 된다.
Stumpff 함수의 정의를 사용하여 식 (26)을 전개하면 다음과 같다.
따라서
식 (28), (30), (31), (32), (33)을 식 (24)에 대입하면 뉴톤-랩슨 방법으로
라그랑지 계수를 계산한 후 식 (3)과 (4)에 대입하면 속도벡터
지금까지 논의한 내용을 정리하면 다음과 같다.
[1]
[2] 비행방향에 따라 식 (7) 또는 (8)로
[3] 식 (13)으로
[4]
1. 식 (28), (31), (19), (22)로
2. 식 (26), (33), (30), (24)로
3. 식 (23)으로
[5] 식 (34)로
[6] 식 (3)과 (4)로
다음은 위 알고리즘을 매트랩 코드로 구현한 것이다.
lambert.m
function [v1_vec, v2_vec] = lambert(r1_vec, r2_vec, tof, dm)
% [v1_vec, v2_vec] = lambert(r1_vec, r2_vec, tof, dm)
% given r1_vec, r2_vec, time-of-flight and direction
% compute v1_vec and v2_vec
%
% Input r1_vec: initial position vector in km
% r2_vec: final position vector in km
% tof: time of flight in sec
% dm: +1 short way (default), -1 long way
% Output v1_vec: initial velocity vector in km/sec
% v2_vec: final velocity vector in km/sec
%
% all in inertial frame
%
% coded by st.watermelon
eps = 1e-8;
if nargin < 4
dm = 1;
end
mu_e=398600; % gravitational parameter km^3/s^2
% step 1 : compute r1 and r2
r1 = norm(r1_vec);
r2 = norm(r2_vec);
% step 2 : compute d_theta
d_the = acos(dot(r1_vec,r2_vec)/(r1*r2));
if dm ~= 1
d_the = 2*pi - d_the;
end
% step 3 : compute A
A = sin(d_the)*sqrt(r1*r2/(1-cos(d_the)));
% step 4 : compute z
z = 0; % guess initial z
for ii = 1:100
% compute C(z) and S(z)
[Cz, Sz] = stumpff(z);
% compute y(z)
yz = r1 + r2 + A*(z*Sz-1)/sqrt(Cz);
% compute F(z)
Fz = (yz/Cz)^(3/2)*Sz + A*sqrt(yz) - sqrt(mu_e)*tof;
% compute derivatives
yz_prime = A/4*sqrt(Cz);
if (z<-eps) || (z>eps)
Cz_prime = (1-z*Sz-2*Cz)/(2*z);
Sz_prime = (Cz-3*Sz)/(2*z);
else
Cz_prime = -1/24;
Sz_prime = -1/80;
end
Fz_prime = 3/2*sqrt(yz/Cz)*(yz_prime*Cz-Cz_prime*yz)/(Cz*Cz)*Sz ...
+ (yz/Cz)^(3/2)*Sz_prime + 1/2*A*yz_prime/sqrt(yz);
% Newton-Raphson
z_next = z - Fz/Fz_prime;
if abs(z_next-z) < eps
break;
else
z = z_next;
end
end
% step 5 : compute Lagrange coefficients
% compute C(z) and S(z)
[Cz, Sz] = stumpff(z);
% compute y(z)
yz = r1 + r2 + A*(z*Sz-1)/sqrt(Cz);
% compute f, g, g_dot
f = 1 - yz/r1;
g = A*sqrt(yz/mu_e);
g_dot = 1 - yz/r2;
% step 6 : compute v1_vec, v2_vec
v1_vec = (r2_vec-f*r1_vec)/g;
v2_vec = (g_dot*r2_vec-r1_vec)/g;
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
'항공우주 > 우주역학' 카테고리의 다른 글
중력 영향권 (Sphere of Influence) (0) | 2024.01.08 |
---|---|
감시정찰 (Surveillance and Reconnaissance) 영역 계산 (0) | 2023.12.26 |
램버트 정리 (Lambert’s theorem) (0) | 2023.12.06 |
케플러 문제 (Kepler’s problem) - 5 (0) | 2023.12.02 |
케플러 문제 (Kepler’s problem) - 4 (0) | 2023.12.01 |
댓글