Hi everyone !
I’m trying to estimate the errors caused by my numerical propagator and came up with the following method :
I recover the orbital elements from a TLE at a certain date, say the 1st of March, and propagate to another date, for example the 9th of March. I then compare the results of my propagation with the updated TLE of this same satellite at the exact date of the results.
I also compare the results of my propagator with and without the added ForceModels.
However, my results seem way off. I compute the relative errors on the position with \frac{abs(x_{th} - x_{exp})}{ x_{th}} and for some reason I have more error when propagating with the “realistic” ForceModels than without.
I brute forced an investigation by trying all the combinations of forces I had, and discovered that the HolmesFeatherstoneAttractionModel is the main cause of the problem. When i remove it from the propagator, my results are way closer to the updated TLE (the reference), and i don’t understand why or how…
some pseudo code to illustrate my thoughts :
# define all the characteristics of the spacecraft
satellite_mass = ...
# I know the following part is not a good thing to do, but i don't know how to do it properly
# get the TLE at the initial date, and extract the orbital parameters from it
sat_initial_tle = TLE(line1,line2)
sat_initial_orbit = user_defined_function_that_creates_a_KeplerianOrbit(sat_initial_TLE)
# get the TLE at the final date, the reference
sat_reference_tle = TLE(line1,line2)
sat_reference_orbit = user_defined_function_that_creates_a_KeplerianOrbit(sat_reference_TLE)
# Create all the ForceModels that are added to the numerical propagator
isotropic_drag = IsotropicDrag(cross_section, drag_coef)
list_of_forces.append(DragForce(SimpleExponentialAtmosphere(earth, 0.0004, 42000.0, 7500.0), isotropic_drag))
gravityProvider = GravityFieldFactory.getNormalizedProvider(10, 10)
list_of_forces.append(HolmesFeatherstoneAttractionModel(FramesFactory.getITRF(IERSConventions.IERS_2010, True), gravityProvider))
list_of_forces.append(ThirdBodyAttraction(moon))
list_of_forces.append(ThirdBodyAttraction(sun))
list_of_forces.append(SolarRadiationPressure(sun, Constants.WGS84_EARTH_EQUATORIAL_RADIUS, IsotropicRadiationClassicalConvention(cross_section, absorption_coef, reflection_coef)))
# create a NumericalPropagator like in the examples
integrator = DormandPrince853Integrator(...)
propagator_num = NumericalPropagator(integrator)
for force in list_of_forces:
propagator_num.addForceModel(force)
# propagate
final_state = propagator_num.propagate(start_date.shiftedBy(duration_between_both_TLE))
# investigate the results
pos_z_theory = sat_reference_orbit.getPVCoordinates().getPosition().z
pos_z_experimental = final_state.orbit.getPVCoordinates().getPosition().z
relative_error = abs(pos_z_theory - pos_e_experimental) / pos_z_theory * 100
# sample output
# relative error on x : 0.12 %
# relative error on z : 1276%
# when doing the exact same calculations but without any ForceModels :
# relative error on x : 0.081 %
# relative error on z : 496%
# Again the same calculation with all ForceModels except HolmesFeatherStoneAttractionModel
# relative error on x : 0.088 %
# relative error on z : 401%
So as you can see, those results are quite unsettling… One explanation could be that the satellite performed a maneuver between the two TLE I used, but I tried on many different satellites and despite the amplitude of the values being lower, the weird trend was still present.
Please let me know if i did something wrong, i’m still a beginner. Thank you all for your feedback.
PS : this is the output PVCoordinates with all forces included, the acceleration on the Z axis seems too high
Theo : {2020-12-09T09:11:13.098, P(-2.724526618536018E7, 1.1576141046260186E7, 9908.796140895838), V(-822.2336477064472, -1936.9220117427658, 3006.0504020394133), A(0.41864020909753735, -0.17787450029587157, -1.5225472418245217E-4)}
Expe : {2020-12-09T09:11:13.098, P(-2.727990503738411E7, 1.1493375183418749E7, 136348.45491551282), V(-804.3678414387626, -1944.106155548559, 3006.263174630185), A(0.4192015938477335, -0.17661915775838216, -0.002094830244918838)}