Estoy calculando la aceleración debida a los armónicos en el marco ECEF. Aquí se muestra el potencial de gravedad en armónicos esféricos (acabo de eliminar " ", considerando sólo el efecto de los armónicos).
,
donde y - grado y orden, y - latitud y longitud respectivamente.
Comparo los resultados con GMAT
. Para grado 2 y orden 0 (J2) el error de propagación fue de 5m. ¡Pero para grado/orden = 8, el error es de 350 km!
Los pasos:
en un bucle ,
Como se ve, la latitud es y la longitud es
Los coeficientes (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
He escrito un código en lenguaje Julia, que construye la expresión (según el grado y el orden).
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)
No estoy familiarizado con Julia, pero en la mayoría de los idiomas devuelve un valor entre . Lo hace porque no sabe si o es positivo o negativo. Entonces, cuando calculas la longitud como:
Eso está en el cuarto cuadrante, que es fuera de donde está realmente la longitud (el segundo cuadrante cuando es positivo y es negativo). Esto no importa para el términos como J2, pero invierte los términos tesérales, ya que y . Eso explicaría la discrepancia en el acuerdo al agregar más términos.
La mayoría de los lenguajes tienen una función especial (generalmente llamada "atan2(x,y)" o alguna variante) que toma dos parámetros: un parámetro x e y. Si no tiene uno, tendrá que usar algunas declaraciones if para considerar en qué cuadrante se encuentra realmente la longitud.
longitude=atan(y/x)+pi*sign(y)*(1-sign(x))/2
. ¿Está bien? Se supone que x e y nunca son 0.
CrisR
UH oh
+1
Gran edición, esto se ve mucho mejor, ¡muy agradable! Intentaré echar un vistazo cuidadoso hoy, ¡gracias por tomarse el tiempo para profundizar en MathJax!CrisR
CrisR
UH oh
litografía
Leeloo
litografía
myu
debería calcularse comoz/r
en lapotential
función?Leeloo
myu
. Pero luego se reemplazó comoz/r
. Supongo que el problema está en eso, la longitud debería seratan2(y,x)
litografía
myu
no depende dex
,y
yz
. Pero lo hace, por lo que las derivadas son incorrectas.Leeloo
myu
. Pero luego, cuando calculas la derivada deU
, elmyu
se reemplaza porz/r
litografía
P_ij(z/r)
al calcularU_sum
. No lo noté antes.cms
Leeloo