I want to understand better these three parameters for integrator DormandPrince853. Why are there two different step for integration? What is exacly position tolerance? thanks.
// 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;
final double positionTolerance = 0.0000000001;
The Dormand-Prince 8(5, 3) is an integrator with variable step size. It will change the step throughout integration to adapt computation to the dynamics of the equation it integrates. In space flight dynamics, this occurs in elliptical orbits because dynamics at apogee are far smoother than at perigee, in orbits with maneuvers, or in reentry cases. In all of these cases, the integrator will detect the dynamics changes and reduce step size in difficult zones with changing dynamics and increase step size in easy zones with smooth dynamics.
The two steps size used at construction correspond to min and max step size, so in the example we allow the integrator to reduce step size down to 1ms (in case of jerky dynamics) or to increase it up to 1000s (in case of smooth cruise modes far from Earth). Of course, we don’t expect the integrator to really reach these extremes.
The integrator detects dynamics changes by estimating current local integration error and compare it to the tolerance value. The computation is quite convoluted and has some limitations:
- error is only estimated, we do not know what the error really is (otherwise we would just correct it)
- estimation is a local integration error, not a global error
both limitations imply that we cannot consider that because we set a tolerance to 1m for example the trajectory will be accurate to 1m. It may be at 1cm, or it may be at 100m. This is an open problem in ODE integrations, we know problems where local error underestimates global error (error is diverging) and other problems were local error overestimate global error (error is converging). However, local error estimation is the only tool we have, so we use it.
In Orekit, the tolerance is expressed first as a tolerance in position, and converted to something the integrator can understand using the
NumericalPropagator.tolerances() method. This helps user having some rough understanding of what it is all about.
The tolerance in the example, set to
0.0000000001 (i.e. 1 Angström), is really not realistic. It will force the integrator to select a step size too small and may well end up with a failure as the integrator would consider it needs a step smaller than 1ms to achieve the 1A accuracy, and the user prevented such small steps. Realistic tolerances are rather 1m or 10m, not 1.0e-10m.
thank you very much for your reply, you were very kind as usual.
I had changed the tolerance position because during calculation of an unperturbed orbit
with a numeric propagator (with DormandPrince853 integrator) I noticed that the major semi-axis was moved to each step (increasing) what is this effect due to?
To minimize this effect I put 1Angström, you point out that it is unrealistic and I agree.