Ich berechne die Beschleunigung aufgrund der Harmonischen im ECEF-Rahmen. Das Gravitationspotential in sphärischen Harmonischen wird hier gezeigt (ich habe gerade " ", da nur der Oberwelleneffekt berücksichtigt wird).
,
wo 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:
In einer Schleife ,
Wie es gesehen wird, ist der Breitengrad und Längengrad ist
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)
Ich bin mit Julia nicht vertraut, aber in den meisten Sprachen gibt einen Wert zwischen zurück . Es tut dies, weil es nicht weiß, ob oder positiv oder negativ ist. Wenn Sie also den Längengrad berechnen als:
Das ist im 4. Quadranten, das ist davon ab, wo der Längengrad tatsächlich ist (der 2. Quadrant, wenn ist positiv u ist negativ). Das spielt für die keine Rolle Terme wie J2, aber es invertiert die tesseralen Terme, da und . Das würde die Diskrepanz in der Übereinstimmung erklären, wenn weitere Begriffe hinzugefügt werden.
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.
longitude=atan(y/x)+pi*sign(y)*(1-sign(x))/2
. Ist es o.k? Angenommen, dass x und y niemals 0 sind.
ChrisR
äh
+1
Tolle 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!ChrisR
ChrisR
äh
Litho
Leelo
Litho
myu
berechnet werden?z/r
potential
Leelo
myu
. Aber dann ersetzt es alsz/r
. Ich nehme an, das Problem liegt darin, dass der Längengrad sein sollteatan2(y,x)
Litho
myu
nicht vonx
,y
und abhängtz
. Aber das tut es, also sind die Ableitungen falsch.Leelo
myu
. Aber dann, wenn Sie die Ableitung von berechnenU
,myu
wird das durch ersetztz/r
Litho
P_ij(z/r)
beim RechnenU_sum
. Vorher ist es mir nicht aufgefallen.cm
Leelo