[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Orekit Users] Taylor algebra and force model parameters



Le 03/04/2018 à 14:12, Christophe Le Bris a écrit :
> Hello,
> 
> I'd like to analyze the effects on the orbit of the dispersion of
> force model parameters.
> Propagating uncertainties on the orbit knowledge from OD uncertainties
> is quite straightforward with "FieldPropagation" but I don't see the
> way to analyze the effect of the uncertainty of a force model
> parameter with taylor algebra in Orekit.
> 
> The only way that I saw to do it (without using classical Monte-Carlo
> simulations) is to implement the effects of the force model by using
> "additionalEquations" instead of "ForceModel".
> 
> But, is there a simple way to use taylor algebra to compute the
> effects of the uncertainties of a force model parameter?


In order to do this, you have to implement the force model by
yourself. In your implementation, there will be an "acceleration"
method that takes a FieldSpacecraftState and an array of Field
elements that correspond to the current value of the force model
parameters.

By default, this array of parameters is created by getting the
double values from the force model parameters drivers, and
converting them directly to Field. This is implemented by the
method getParameters in the ForceModel interface, which has
a default implementation. You can override this default
implementation to return Field versions of the parameters
that you will build beforehand by yourself if you want.

Once this is done, before propagation start you will have
to set up the parameters for the force model. If for example
you are interested only in the uncertainties with respect to
a few force model parameters and not in uncertainties with respect
to the initial orbit, you will create a dactory for the Derivative
structures as:

   DSFactory factory = new DSFactory(nbForceParams, order);

then you will create the initial orbit using calls to factory.constant()

  FieldOrbit<DerivativeStructure> initialOrbit =
   new FieldKeplerianOrbit<>(factory.constant(a),
                             factory.constant(e),
                             ...);

because the initial orbit does not depend on the force parameters
(the final orbit will depend on them, but not the initial orbit).

then you will create the force model parameters using factory.variable
has these parameters are the canonical variables of your model:

 ForceModel fm = new MyForceModel(factory.variable(0, p0),
                                  factory.variable(1, p1),
                                  ...);

At propagation end, when you retrieve the final state, you
extract its partial derivatives to any order up to the maximum
specified earlier using:

 // here I assume nbForceParams is 2, but you can have more
 double daOverdP0    = orbit.getA().getPartialDerivatives(1, 0);
 double daOverdP1    = orbit.getA().getPartialDerivatives(0, 1);
 double d2aOverdP02  = orbit.getA().getPartialDerivatives(2, 0);
 double d2aOverdP12  = orbit.getA().getPartialDerivatives(0, 2);
 double d2aOverdP0P1 = orbit.getA().getPartialDerivatives(1, 1);
 ... and so on for higher orders ...


So as a summary, the trick is to override the getParameters method
in your force model, and to build the initial state and force model
correctly.

best regards,
Luc

> 
> Christophe
>