Berechnung des Erd-Geopotential-Effekts

Ich berechne die Beschleunigung aufgrund der Harmonischen im ECEF-Rahmen. Das Gravitationspotential in sphärischen Harmonischen wird hier gezeigt (ich habe gerade " 1 + ", da nur der Oberwelleneffekt berücksichtigt wird).

U h a r = μ r [ ich = 2 d j = 0 Ö ( R e q r ) ich P ich j ( Sünde ϕ ) ( S ich j Sünde j λ + C ich j cos j λ ) ] ,

wo d und Ö - Grad und Ordnung, ϕ und λ - Breitengrad bzw. Längengrad.

Ich vergleiche die Ergebnisse mit GMAT. Für Grad 2 und Ordnung 0 (J2) betrug der Ausbreitungsfehler 5 m. Aber für Grad/Ordnung = 8 beträgt der Fehler 350 km!

Die Schritte:

  1. In einer Schleife ich [ 2 , 2 ] , j [ 0 , 0 ]

    • Berechne das P ich = d ich + j d μ ich + j ( μ 2 1 ) ich
    • Berechnen Sie das Legendre-Polynom P ich j = ( 1 μ 2 ) j 2 ich ! 2 ich P ich
    • Berechne das s u m + = P ich j ( z r ) ( C cos ( j a t a n ( j x ) ) + S Sünde ( j a t a n ( j x ) ) ) ( R e q r ) ich
  2. Berechnen Sie das Potenzial U h a r = μ s u m r
  3. Berechne das a x : f = d U h a r d x
  4. Berechnen Sie den Wert im Punkt f ( r x , r j , r z )

Wie es gesehen wird, ist der Breitengrad a s ich n ( z r ) und Längengrad ist a t a n ( j x )

Die Koeffizienten (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

Ich habe einen Code auf Julia-Sprache geschrieben, der den Ausdruck (je nach Grad und Reihenfolge) aufbaut.

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)
In welchem ​​Rahmen befinden sich die X-, Y- und Z-Koordinaten? Sie müssen in ECEF sein.
+1Tolle Bearbeitung, das sieht viel besser aus, sehr schön! Ich werde versuchen, heute einen genauen Blick darauf zu werfen, danke, dass Sie sich die Zeit genommen haben, sich mit MathJax zu beschäftigen!
@Leeloo, okay, danke für die Änderungen. Um ehrlich zu sein, bin ich mir leider nicht sicher, wie ich diese Frage beantworten soll, da ich nur die Pines-Gleichungen verwendet habe, um die Harmonischen zu berechnen.
@Leeloo die Gleichungen sind mehrere Seiten lang. Eine gute Referenz ist Kapitel 2 der Dissertation von Brandon A. Jones 2010. Es ist kostenlos auf der Website der University of Colorado erhältlich. Der Dateiname sollte meiner Meinung nach "bajones2010" heißen. Er erwähnt auch zwei weitere Formulierungen, die die Berechnung beschleunigen sollten (Fantino 2008), die mir aber deutlich komplexer erschienen. Ich habe Pines hier in Rust als Teil eines Toolkits implementiert, an dem ich schreibe, um den größten Teil der von mir durchgeführten Analysen zu automatisieren, und mit der Genauigkeit von GMAT.
@Leeloo Schau ich mir mal an, das sieht sehr vielversprechend aus! Eventuell auch hier hilfreich: Wie kann ich mein rekonstruiertes Schwerefeld von Ceres anhand von Kugelflächenfunktionen verifizieren?
Ich bin mit Julias Sprache nicht vertraut, aber es scheint mir, dass wenn Sie differenzieren U von x , davon gehst du aus μ und λ konstant bleiben als x Änderungen, was falsch ist. Sie sagen, dass Sie bereits versucht haben, den Breitengrad durch zu ersetzen wie in ( z r ) , Längengrad mit eine Lohe ( j x ) ; könnten Sie bitte das Programm mit diesen Änderungen zeigen?
@Litho Aktualisiert.
Sollte nicht wie in der Funktion myuberechnet werden? z/rpotential
@Litho Nein, es gibt die Ableitung von myu. Aber dann ersetzt es als z/r. Ich nehme an, das Problem liegt darin, dass der Längengrad sein sollteatan2(y,x)
Nun, wie gesagt, ich kenne Julia nicht, aber es scheint mir, dass dieser Ansatz impliziert, dass myunicht von x, yund abhängt z. Aber das tut es, also sind die Ableitungen falsch.
@Litho Es geht nicht um die Sprache: Im Legendre-Polynom berechnen Sie die Ableitung von myu. Aber dann, wenn Sie die Ableitung von berechnen U, myuwird das durch ersetztz/r
Ach, jetzt verstehe ich. Sie verwenden P_ij(z/r)beim Rechnen U_sum. Vorher ist es mir nicht aufgefallen.
Können Sie uns die ersten Zeilen Ihrer Koeffizientendatei zeigen?
@cms Zur Frage hinzugefügt.

Antworten (1)

Seien Sie vorsichtig mit Arcus Tangens

Ich bin mit Julia nicht vertraut, aber in den meisten Sprachen arctan ( j / x ) gibt einen Wert zwischen zurück [ π / 2 , π / 2 ] . Es tut dies, weil es nicht weiß, ob j oder x positiv oder negativ ist. Wenn Sie also den Längengrad berechnen als:

λ = arctan ( j x ) = arctan ( 4617 × 10 3 1709 × 10 3 ) = 69.7

Das ist im 4. Quadranten, das ist 180 davon ab, wo der Längengrad tatsächlich ist (der 2. Quadrant, wenn j ist positiv u x ist negativ). Das spielt für die keine Rolle j = 0 Terme wie J2, aber es invertiert die tesseralen Terme, da Sünde ( θ + 180 ) = Sünde θ und cos ( θ + 180 ) = cos ( θ ) . Das würde die Diskrepanz in der Übereinstimmung erklären, wenn weitere Begriffe hinzugefügt werden.

Verwenden Sie einen arctan2

Die meisten Sprachen haben eine spezielle Funktion (normalerweise "atan2(x,y)" oder eine andere Variante genannt), die zwei Parameter akzeptiert: einen x- und einen y-Parameter. Wenn Sie keinen haben, müssen Sie einige if-Anweisungen verwenden, um zu prüfen, in welchem ​​​​Quadranten sich der Längengrad tatsächlich befindet.

Du hast absolut recht. Es gibt jedoch einige Probleme mit atan2 in Julia, also habe ich longitude=atan(y/x)+pi*sign(y)*(1-sign(x))/2. Ist es o.k? Angenommen, dass x und y niemals 0 sind.