Hi @AlexS
Welcome to the Orekit forum!
For the computation of the lat/lon, you use two different frames:
subpoint_KAZSAT = [EarthModel.transform(tp, GCRF, tt) for tt, tp in zip(t,p)]
lat_KAZSAT = np.degrees([gp.getLatitude() for gp in subpoint_KAZSAT])
lon_KAZSAT = np.degrees([gp.getLongitude() for gp in subpoint_KAZSAT])
subpoint_KAZSAT2 = [EarthModel.transform(tp, TEMEFrame, tt) for tt, tp in zip(t,p_KAZSAT)]
lat_KAZSAT2 = np.degrees([gp.getLatitude().value for gp in subpoint_KAZSAT2])
lon_KAZSAT2 = np.degrees([gp.getLongitude().value for gp in subpoint_KAZSAT2])
For the first one, did you try to not convert the orbit in GCRF but using TEME frame instead? Something like:
pv = [TLEpropagator_KAZSAT.getPVCoordinates(tt) for tt in t]
p = [tpv.getPosition() for tpv in pv]
#####
subpoint_KAZSAT = [EarthModel.transform(tp, TEMEFrame, tt) for tt, tp in zip(t,p)]
lat_KAZSAT = np.degrees([gp.getLatitude() for gp in subpoint_KAZSAT])
lon_KAZSAT = np.degrees([gp.getLongitude() for gp in subpoint_KAZSAT])
It should not change your results, but it will reduce the number of frame transformations and then the possibilities of doing something wrong.
Otherwise, I don’t see mistake in you code.
But, it is important to know that TLE accuracy is really poor. The error can reach 1 km at the TLE epoch and the more the propagation duration is, the more the error is. Here I see a difference of two days between the TLE epoch and the start date of you simulation. In addition, I see your propagation model for the numerical simulation is accurate (12x12 geopotential, SRP, drag, Sun, Moon, Relativity). Therefore, I expect important differences between the two simulations.
SGP4 model, the one used for LEO satellites, is limited to J2, J3, J4, and J5 zonal harmonics (I think there is also the related tesseral ones), SRP, and Drag. The SDP4 model adds the luni-solar attraction.
Did you try to use the TLE epoch as start date ?
Also, did you try to use close propagation model between SGP4 and the numerical one?
These two questions are asked in order to mitigate the accuracy issu and see if there is a mistake somewhere in the code.
Best regards,
Bryan