Cálculo del efecto geopotencial de la Tierra

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 " 1 + ", considerando sólo el efecto de los armónicos).

tu h a r = m r [ i = 2 d j = 0 o ( R mi q r ) i PAG i j ( pecado ϕ ) ( S i j pecado j λ + C i j porque j λ ) ] ,

donde d y o - 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:

  1. en un bucle i [ 2 , 2 ] , j [ 0 , 0 ]

    • Calcula el PAG i = d i + j d m i + j ( m 2 1 ) i
    • Calcular el polinomio de Legendre PAG i j = ( 1 m 2 ) j 2 i ! 2 i PAG i
    • Calcula el s tu metro + = PAG i j ( z r ) ( C porque ( j a t a norte ( y X ) ) + S pecado ( j a t a norte ( y X ) ) ) ( R mi q r ) i
  2. Calcular el potencial tu h a r = m s tu metro r
  3. Calcula el a X : F = d tu h a r d X
  4. Calcular el valor en el punto F ( r X , r y , r z )

Como se ve, la latitud es a s i norte ( z r ) y la longitud es a t a norte ( y X )

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)
¿En qué marco están las coordenadas X, Y y Z? Necesitan estar en ECEF.
+1Gran edición, esto se ve mucho mejor, ¡muy agradable! Intentaré echar un vistazo cuidadoso hoy, ¡gracias por tomarse el tiempo para profundizar en MathJax!
@Leeloo, está bien, gracias por las ediciones. Para ser honesto, lamentablemente no estoy seguro de cómo responder a esta pregunta, ya que solo he usado las ecuaciones de Pines para calcular los armónicos.
@Leeloo las ecuaciones tienen varias páginas. Una buena referencia es el Capítulo 2 de la tesis doctoral de Brandon A. Jones 2010. Está disponible gratuitamente en el sitio web de la Universidad de Colorado. El nombre del archivo debería llamarse "bajones2010", creo. También menciona otras dos formulaciones que deberían acelerar los cálculos (Fantino 2008), pero me parecieron significativamente más complejas. Implementé Pines aquí , en Rust, como parte de un conjunto de herramientas que estoy escribiendo para automatizar la mayoría de los análisis que hago, y con la fidelidad de GMAT.
@Leeloo Le echaré un vistazo, ¡parece muy prometedor! Posiblemente útil aquí también: ¿Cómo puedo verificar mi campo de gravedad reconstruido de Ceres a partir de armónicos esféricos?
No estoy familiarizado con el lenguaje de Julia, pero me parece que cuando diferencia tu por X , asumes que m y λ mantenerse constante como X cambia, lo cual es incorrecto. Dices que ya has intentado reemplazar la latitud con como en ( z r ) , longitud con un bronceado ( y X ) ; ¿podría mostrar el programa con estos cambios?
@Lito Actualizado.
¿No myudebería calcularse como z/ren la potentialfunción?
@Litho No, existe la derivada por myu. Pero luego se reemplazó como z/r. Supongo que el problema está en eso, la longitud debería seratan2(y,x)
Bueno, como dije, no conozco a Julia, pero me parece que este enfoque implica que myuno depende de x, yy z. Pero lo hace, por lo que las derivadas son incorrectas.
@Litho No se trata del idioma: en el polinomio de Legendre calculas la derivada por myu. Pero luego, cuando calculas la derivada de U, el myuse reemplaza porz/r
Oh, ya veo. Se utiliza P_ij(z/r)al calcular U_sum. No lo noté antes.
¿Puede mostrarnos las primeras líneas de su archivo de coeficientes?
@cms Agregado a la pregunta.

Respuestas (1)

Cuidado con el arco tangente

No estoy familiarizado con Julia, pero en la mayoría de los idiomas arcán ( y / X ) devuelve un valor entre [ π / 2 , π / 2 ] . Lo hace porque no sabe si y o X es positivo o negativo. Entonces, cuando calculas la longitud como:

λ = arcán ( y X ) = arcán ( 4617 × 10 3 1709 × 10 3 ) = 69.7

Eso está en el cuarto cuadrante, que es 180 fuera de donde está realmente la longitud (el segundo cuadrante cuando y es positivo y X es negativo). Esto no importa para el j = 0 términos como J2, pero invierte los términos tesérales, ya que pecado ( θ + 180 ) = pecado θ y porque ( θ + 180 ) = porque ( θ ) . Eso explicaría la discrepancia en el acuerdo al agregar más términos.

Usa un arctan2

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.

Estás absolutamente en lo correcto. Sin embargo, hay algunos problemas con atan2 en Julia, así que usé longitude=atan(y/x)+pi*sign(y)*(1-sign(x))/2. ¿Está bien? Se supone que x e y nunca son 0.