Я рассчитываю ускорение из-за гармоник в кадре ECEF. Здесь показан гравитационный потенциал в сферических гармониках (я просто убрал " ", так как учитывается только эффект гармоник).
,
куда и - степень и порядок, и - широта и долгота соответственно.
Я сравниваю результаты с GMAT
. Для степени 2 и порядка 0 (J2) ошибка распространения составила 5m. Но для степени/порядка=8 ошибка составляет 350 км!
Шаги:
В петле ,
Как видно, широта а долгота
Коэффициенты (JGM-3):
2 0 -0.10826360229840e-02 0.0
2 1 -0.24140000522221e-09 0.15430999737844e-08
2 2 0.15745360427672e-05 -0.90386807301869e-06
Я написал код на языке Julia, который строит выражение (в зависимости от степени и порядка).
using SatelliteToolbox
using SymEngine
path="C:/xampp/htdocs/sat_prop/";
JGM_coeff_file=string(path,"coeff.txt");
const date = DatetoJD(2100,01,01,0,0,0)
const degree = 8
y = [-4617E+03, 1709E+03, -5040E+03]
const Req = 6378136.3
const GMe = 398600.4415E+9
function harmonics(dy,y,dU,date)
dy= [
dU[1](y[1],y[2],y[3]),
dU[2](y[1],y[2],y[3]),
dU[3](y[1],y[2],y[3])
]
end
function potential()
@vars x y z myu
CS=open(readdlm,JGM_coeff_file)
longitude=atan( y/x );
r=(x^2+y^2+z^2)^(1/2)
U_sum=0
for i=2:degree
for j=0:degree
index=1+j; for ll=2:i-1 index+=ll+1; end
P_i=(myu^2-1)^i
for k=1:i+j P_i=diff(P_i,myu) end
P_ij=(((1-myu^2)^(j/2))/(factorial(i)*2^i))*P_i
if(P_ij!=0)
U_sum+= P_ij(z/r)*(CS[index,3]*cos(j*longitude)+CS[index,4]*sin(j*longitude))*(Req/r)^i
end
end
end
U=GMe*(U_sum)/r
return lambdify(expand(diff(U,x)),[x,y,z]),lambdify(expand(diff(U,y)),[x,y,z]),lambdify(expand(diff(U,z)),[x,y,z])
end
dU=potential();
dy=zero(y)
@time harmonics(dy,y,dU,date)
@time harmonics(dy,y,dU,date)
Я не знаком с Джулией, но на большинстве языков возвращает значение между . Он делает это, потому что не знает, или является положительным или отрицательным. Итак, когда вы вычисляете долготу как:
То есть в четвертом квадранте, т. от того места, где на самом деле находится долгота (2-й квадрант, когда положительный и является отрицательным). Это не имеет значения для такие как J2, но он инвертирует тессеральные члены, так как и . Это могло бы объяснить несоответствие в соглашении при добавлении дополнительных терминов.
В большинстве языков есть специальная функция (обычно называемая "atan2(x,y)" или ее вариант), которая принимает два параметра: параметр x и y. Если у вас его нет, вам придется использовать некоторые операторы if, чтобы определить, в каком квадранте на самом деле находится долгота.
longitude=atan(y/x)+pi*sign(y)*(1-sign(x))/2
. Это нормально? Предполагается, что x и y никогда не равны 0.
КрисР
ооо
+1
Отличный монтаж, так намного лучше выглядит, очень красиво! Сегодня я постараюсь внимательно посмотреть, спасибо, что нашли время покопаться в MathJax!КрисР
КрисР
ооо
Лито
Лиилу
Лито
myu
следует рассчитывать, какz/r
вpotential
функции?Лиилу
myu
. Но затем он заменил какz/r
. Я полагаю, проблема в том, что долгота должна бытьatan2(y,x)
Лито
myu
не зависит отx
,y
иz
. Но это так, поэтому производные неверны.Лиилу
myu
. Но затем, когда вы вычисляете производную отU
,myu
заменяется наz/r
Лито
P_ij(z/r)
при расчетеU_sum
. Я не замечал этого раньше.смс
Лиилу