# 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:

$\begin{split}\Phi(t,t_{0}) &= \frac{\partial \mathbf{x}(t)}{\partial\mathbf{x}(t_{0})}\\ S &= \frac{\partial \mathbf{x}(t)}{\partial \mathbf{p }}\\\end{split}$

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:

• Single-arc variational equations solver.
• Multi-arc 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 type Body 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 (if integrateDynamicalAndVariationalEquationsConcurrently is false). This pointer is empty by default, in which case the integratorSettings 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 arc-wise 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 multi-arc 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( );