Brouwer-Lyddane propagation precision issue

Hi, when using the Brouwer-Lyddane propagator in Orekit to extrapolate the orbit of a low earth circular orbit satellite, the error reached 50 kilometers during a one-hour extrapolation. What could be the possible reasons? the reference value is close to the numerical propagated results.

final Frame inertialFrame = FramesFactory.getEME2000();
        AbsoluteDate initDate = new AbsoluteDate(2024, 12, 1, 0, 0, 0, TimeScalesFactory.getUTC());
        double timeshift = 3600 ;
        NormalizedSphericalHarmonicsProvider provider = GravityFieldFactory.getNormalizedProvider(5, 0);

        // Initial orbit

        final Orbit initialOrbit = new KeplerianOrbit(new PVCoordinates(new Vector3D(-5053374.356, -3419077.892, -4241149.605),
                new Vector3D(-4221.103996, -1055.944563, 5887.522421)),
                inertialFrame, initDate, provider.getMu());
        // Initial state definition
        final SpacecraftState initialState = new SpacecraftState(initialOrbit);

        //_______________________________________________________________________________________________
        // SET UP A REFERENCE NUMERICAL PROPAGATION
        //_______________________________________________________________________________________________

        // Adaptive step integrator with a minimum step of 0.001 and a maximum step of 1000
        final double minStep = 0.001;
        final double maxstep = 1000.0;
        final double positionTolerance = 10.0;
        final OrbitType propagationType = OrbitType.CIRCULAR;
        final double[][] tolerances =
                ToleranceProvider.getDefaultToleranceProvider(positionTolerance).getTolerances(initialOrbit, propagationType);
        final AdaptiveStepsizeIntegrator integrator =
                new DormandPrince853Integrator(minStep, maxstep, tolerances[0], tolerances[1]);

        // Numerical Propagator
        final NumericalPropagator NumPropagator = new NumericalPropagator(integrator);
        NumPropagator.setOrbitType(propagationType);

        final ForceModel holmesFeatherstone =
                new HolmesFeatherstoneAttractionModel(FramesFactory.getITRF(IERSConventions.IERS_2010, true), provider);
        NumPropagator.addForceModel(holmesFeatherstone);

        // Set up initial state in the propagator
        NumPropagator.setInitialState(initialState);

        // Extrapolate from the initial to the final date
        final SpacecraftState NumFinalState = NumPropagator.propagate(initDate.shiftedBy(timeshift));
        final TimeStampedPVCoordinates numPV = NumFinalState.getOrbit().getPVCoordinates();

        //_______________________________________________________________________________________________
        // SET UP A BROUWER LYDDANE PROPAGATION
        //_______________________________________________________________________________________________

        BrouwerLyddanePropagator BLextrapolator =
                new BrouwerLyddanePropagator(initialOrbit, GravityFieldFactory.getUnnormalizedProvider(provider), BrouwerLyddanePropagator.M2);

        SpacecraftState BLFinalState = BLextrapolator.propagate(initDate.shiftedBy(timeshift));
        TimeStampedPVCoordinates blPv = BLFinalState.getPVCoordinates();

Hello @afei and welcome to the Orekit forum !

After further investigations, i believe your issue comes from the Orekit data you are using.

When i used your example, i had a difference of 17km. I then tried several settings and other propagators but once i updated my orekit data, it went down to 2.6 km.

Could you launch the update.sh script located in your orekit data and tell us how it goes ?

Cheers,
Vincent

Thank you very much for your reply. @Vincent I’m curious to know which files in the orekit-data might affect the accuracy of the BL propagator. Since the orekit-date was updated in 2025, the propagated data is 2024

I updated the orekit data, but the result accuracy hasn’t shown significant improvement…

Ok, i wanted to make sure since i did not have the same error to begin with.

I see that you based your code from an Orekit test which is a good start. I’ll keep you updated :+1: .

I apologize for not expressing the issue clearly. Using the parameter settings in the code for extrapolation, I obtained a deviation of 17,340 meters. During testing, I found that the maximum hourly extrapolation deviation can reach up to 50,000 meters. Even after updating Orekit-data, the accuracy still cannot be improved.

First, I would like to know the approximate accuracy range of the BLpropagator for low-Earth orbit (LEO) satellites. Second, since my M2 parameter is set to 0, which files in Orekit-data need to be updated when using the BLpropagator?

Brouwer-Lyddane is a very crude model, it only takes very few perturbations in account.

We used it a lot in the 90’s when computers where not as fast as they are now, but not so much anymore.

Is your satellite very low? Gravity field effects are more important when satellite is closer to Earth and as Brouwer-Lyddane only considers very few zonal parameters, its accuracy is very limited.

The orbital altitude of my satellite is 1050km, with an eccentricity <= 0.03 and an orbital inclination of 99 degrees