3.7. Performing Variational Equations Propagation¶
Up to this point, we have been concerned with propagating states of bodies only. Tudat is also capable of propagating the variational equations associated with the dynamics to produce the state transition matrix \(\Phi(t,t_{0})\) and sensitivity matrix \(S(t)\), which we define here as:
where \(\mathbf{x}\) is the propagated state, \(\mathbf{p}\) the vector of a parameter vector (e.g. gravity field parameters, rotation model parameters, etc.), and \(t_{0}\) denotes the initial time.
Note
In some literature, the sensitivity matrix is not defined separately, but the state transition matrix \(\Phi(t,t_{0})\) is defined as \(\frac{\partial[\mathbf{x}(t);\text{ }\mathbf{p}]}{\partial[\mathbf{x}(t_{0};\text{ }\mathbf{p}])}\)
The propagation of these equations is done similarly as for the dynamics, and is executed by a (derived class of) VariationalEquationsSolved
At the moment, the following VariationalEquationsSolver
options are available or under development in Tudat:
 Singlearc variational equations solver.
 Multiarc variational equations solver.
 Hybrid variational equations solver (under development).
These are implemented in derived classes and are discussed below. Note that these objects of these classes propagate bothe the variational equations and dynamics (either concurrently or sequentially).

class
VariationalEquationsSolver
¶ Base class from which the classes below are derived.

class
SingleArcVariationalEquationsSolver
¶ This derived class simulates single arc dynamics and variational equations and its constructor is:
SingleArcVariationalEquationsSolver( bodyMap, integratorSettings, propagatorSettings, parametersToEstimate, integrateDynamicalAndVariationalEquationsConcurrently, variationalOnlyIntegratorSettings, clearNumericalSolution, integrateEquationsOnCreation );
where:
bodyMap
NamedBodyMap
the map containing all the objects of typeBody
used in the simulation.integratorSettings
IntegratorSettings
contains the settings of the integrator used, as discussed in Integrator Settings.propagatorSettings
PropagatorSettings
contains the settings that defines how the dynamics is propagated, as described in Propagator Settings: Basics.Warning
Propagation of variational equations (for translational motion) is only supported for propagated coordinates of size 6. For a description of the difference between conventional and propagated coordinates, see Propagator Settings: Conventional vs. Propagated Coordinates. On the same page (in Propagated Coordinates in Tudat) you can find a list of the available propagated coordinates and their respective sizes.
parametersToEstimate
EstimatableParameterSet
contains the settings that define the parameters \(\mathbf{x}_{0}\) and \(\mathbf{p}\) for which the variational equations are to be solved, as described in Setting Up Estimated Parameters.integrateDynamicalAndVariationalEquationsConcurrently
Boolean to denote whether the equations of motion and variational equations are to be propagated concurrently (default: true), or if the variational eqautions are to be solved after the equations of motion.
variationalOnlyIntegratorSettings
IntegratorSettings
contains the settings of the integrator used, as discussed in Integrator Settings, when propagating the variational equations separately (ifintegrateDynamicalAndVariationalEquationsConcurrently
is false). This pointer is empty by default, in which case theintegratorSettings
are used.clearNumericalSolution
Boolean to denote whether numerical solutions of the propagated equations can be retrieved manually from the object after propagation (if false), or if they are cleared from memory (if true).
integrateEquationsOnCreation
Boolean to denote whether the equations of motion and variational equations are to be propagated immediately when the object is created (default true).

class
MultiArcVariationalEquationsSolver
¶ This derived class allows the numerical propagation of variational equations for arcwise dynamics. It is constructed using:
MultiArcVariationalEquationsSolver( bodyMap, integratorSettings, propagatorSettings, parametersToEstimate, arcStartTimes, integrateDynamicalAndVariationalEquationsConcurrently, variationalOnlyIntegratorSettings, clearNumericalSolution, integrateEquationsOnCreation ) );
where:
arcStartTimes
std::vector< double >
contains the times at which the separate arcs start.

class
HybridArcVariationalEquationsSolver
¶ Allows some bodies to be propagated in a single arc, and some in a multiarc fashion. See
HybridArcDynamicsSimulator
for model details. It is constructed using:HybridArcVariationalEquationsSolver( bodyMap, integratorSettings, propagatorSettings, parametersToEstimate, arcStartTimes, integrateDynamicalAndVariationalEquationsConcurrently, clearNumericalSolution, integrateEquationsOnCreation ) );
3.7.1. Retrieving the variational equation history¶
Once the VariationalEquationsSolver
object has been created and the equations of motion have been integrated, the propagation history of the selected bodies is stored within the VariationalEquationsSolver
. To make use of it manually after propagation, such history can to be retrieved and saved to a file.
If the variational equations propagation history needs to be saved, the following code can be used (assuming an object of type SingleArcVariationalEquationsSolver
called variationalEquationsSimulator has been created):
std::map< double, Eigen::MatrixXd > stateTransitionResult =
variationalEquationsSimulator.getNumericalVariationalEquationsSolution( ).at( 0 );
std::map< double, Eigen::MatrixXd > sensitivityResult =
variationalEquationsSimulator.getNumericalVariationalEquationsSolution( ).at( 1 );
Where the state transition and sensitivity matrix are storeed separately. Saving the results to a file is done in the same manner as for the dynamics. Note however, that the matrix entries of the maps in the above are spread out over a single row in the output file. The concatenation of the matrix entries is done row by row.
The state propagation history can also be retrieved from the object, as follows:
std::map< double, Eigen::VectorXd > integrationResult =
variationalEquationsSimulator.getDynamicsSimulator( )>getEquationsOfMotionNumericalSolution( );