Drake
Drake C++ Documentation
ScalarInitialValueProblem< T > Class Template Reference

## Detailed Description

### template<typename T> class drake::systems::ScalarInitialValueProblem< T >

A thin wrapper of the InitialValueProblem class to provide a simple interface when solving scalar initial value problems i.e.

when evaluating the x(t; 𝐤) solution function to the given ODE dx/dt = f(t, x; 𝐤), where f : t ⨯ x → ℝ , t ∈ ℝ, x ∈ ℝ, 𝐤 ∈ ℝᵐ, along with an initial condition x(t₀; 𝐤) = x₀. The parameter vector 𝐤 allows for generic IVP definitions, which can later be solved for any instance of said vector.

Note the distinction from general initial value problems where f : t ⨯ 𝐱 → ℝⁿ and 𝐱 ∈ ℝⁿ, addressed by the class being wrapped. While every scalar initial value problem could be written in vector form, this wrapper keeps both problem definition and solution in their scalar form with almost zero overhead, leading to clearer code if applicable. Moreover, this scalar form facilitates single-dimensional quadrature using methods for solving initial value problems.

See InitialValueProblem class documentation for information on caching support and dense output usage for improved efficiency in scalar IVP solving.

For further insight into its use, consider the following examples of scalar IVPs:

• The population growth of an hypothetical bacteria colony is described by dN/dt = r * N. The colony has N₀ subjects at time t₀. In this context, x ≜ N, x₀ ≜ N₀, 𝐤 ≜ [r], dx/dt = f(t, x; 𝐤) = 𝐤₁ * x.
• The charge Q stored in the capacitor of a (potentially equivalent) series RC circuit driven by a time varying voltage source E(t) can be described by dQ/dt = (E(t) - Q / Cs) / Rs, where Rs refers to the resistor's resistance and Cs refers to the capacitor's capacitance. In this context, and assuming an initial stored charge Q₀ at time t₀, x ≜ Q, 𝐤 ≜ [Rs, Cs], x₀ ≜ Q₀, dx/dt = f(t, x; 𝐤) = (E(t) - x / 𝐤₂) / 𝐤₁.
Template Parameters
 T The scalar type, which must be one of the default nonsymbolic scalars.

#include <drake/systems/analysis/scalar_initial_value_problem.h>

## Public Types

using ScalarOdeFunction = std::function< T(const T &t, const T &x, const VectorX< T > &k)>
Scalar ODE dx/dt = f(t, x; 𝐤) function type. More...

## Public Member Functions

ScalarInitialValueProblem (const ScalarOdeFunction &scalar_ode_function, const T &x0, const Eigen::Ref< const VectorX< T >> &k=Vector0< T >{})
Constructs a scalar IVP described by the given scalar_ode_function, using given x0 as initial conditions, and parameterized with k. More...

Solve (const T &t0, const T &tf) const
Solves the IVP from time t0 up to time tf, using the initial state 𝐱₀ and parameter vector 𝐤 provided in the constructor. More...

std::unique_ptr< ScalarDenseOutput< T > > DenseSolve (const T &t0, const T &tf) const
Solves and yields an approximation of the IVP solution x(t; 𝐤) for the closed time interval between the initial time t0 and the final time tf, using initial state 𝐱₀ and parameter vector 𝐤 provided in the constructor. More...

template<typename Integrator , typename... Args>
Integratorreset_integrator (Args &&... args)
Resets the internal integrator instance by in-place construction of the given integrator type. More...

const IntegratorBase< T > & get_integrator () const
Gets a reference to the internal integrator instance. More...

IntegratorBase< T > & get_mutable_integrator ()
Gets a mutable reference to the internal integrator instance. More...

Does not allow copy, move, or assignment
ScalarInitialValueProblem (const ScalarInitialValueProblem &)=delete

ScalarInitialValueProblemoperator= (const ScalarInitialValueProblem &)=delete

ScalarInitialValueProblem (ScalarInitialValueProblem &&)=delete

ScalarInitialValueProblemoperator= (ScalarInitialValueProblem &&)=delete

## ◆ ScalarOdeFunction

 using ScalarOdeFunction = std::function& k)>

Scalar ODE dx/dt = f(t, x; 𝐤) function type.

Parameters
 t The independent variable t ∈ ℝ . x The dependent variable x ∈ ℝ . k The parameter vector 𝐤 ∈ ℝᵐ.
Returns
The derivative dx/dt ∈ ℝ.

## ◆ ScalarInitialValueProblem() [1/3]

 ScalarInitialValueProblem ( const ScalarInitialValueProblem< T > & )
delete

## ◆ ScalarInitialValueProblem() [2/3]

 ScalarInitialValueProblem ( ScalarInitialValueProblem< T > && )
delete

## ◆ ScalarInitialValueProblem() [3/3]

 ScalarInitialValueProblem ( const ScalarOdeFunction & scalar_ode_function, const T & x0, const Eigen::Ref< const VectorX< T >> & k = Vector0< T >{} )

Constructs a scalar IVP described by the given scalar_ode_function, using given x0 as initial conditions, and parameterized with k.

Parameters
 scalar_ode_function The ODE function f(t, 𝐱; 𝐤) that describes the state evolution over time. x0 The initial state 𝐱₀ ∈ ℝ. k The parameter vector 𝐤 ∈ ℝᵐ. By default m=0 (no parameters).

## ◆ DenseSolve()

 std::unique_ptr > DenseSolve ( const T & t0, const T & tf ) const

Solves and yields an approximation of the IVP solution x(t; 𝐤) for the closed time interval between the initial time t0 and the final time tf, using initial state 𝐱₀ and parameter vector 𝐤 provided in the constructor.

To this end, the wrapped IntegratorBase instance solves this IVP, advancing time and state from t₀ and 𝐱₀ = 𝐱(t0) to tf and 𝐱(tf), creating a dense output over that [t0, tf] interval along the way.

Parameters
 tf The IVP will be solved up to this time, which must be ≥ t0. Usually, t0 < tf as an empty dense output would result if t0 = tf.
Returns
A dense approximation to 𝐱(t; 𝐤) with 𝐱(t0; 𝐤) = 𝐱₀, defined for t0 ≤ t ≤ tf.
Note
The larger the given tf value is, the larger the approximated interval will be. See documentation of the specific dense output technique in use for reference on performance impact as this interval grows.
Exceptions
 std::exception if t0 > tf.

## ◆ get_integrator()

 const IntegratorBase& get_integrator ( ) const

Gets a reference to the internal integrator instance.

## ◆ get_mutable_integrator()

 IntegratorBase& get_mutable_integrator ( )

Gets a mutable reference to the internal integrator instance.

## ◆ operator=() [1/2]

 ScalarInitialValueProblem& operator= ( const ScalarInitialValueProblem< T > & )
delete

## ◆ operator=() [2/2]

 ScalarInitialValueProblem& operator= ( ScalarInitialValueProblem< T > && )
delete

## ◆ reset_integrator()

 Integrator* reset_integrator ( Args &&... args )

Resets the internal integrator instance by in-place construction of the given integrator type.

A usage example is shown below.

scalar_ivp.reset_integrator<RungeKutta2Integrator<T>>(max_step);
Parameters
 args The integrator type-specific arguments.
Returns
The new integrator instance.
Template Parameters
 Integrator The integrator type, which must be an IntegratorBase subclass. Args The integrator specific argument types.
Warning
This operation invalidates pointers returned by ScalarInitialValueProblem::get_integrator() and ScalarInitialValueProblem::get_mutable_integrator().

## ◆ Solve()

 T Solve ( const T & t0, const T & tf ) const

Solves the IVP from time t0 up to time tf, using the initial state 𝐱₀ and parameter vector 𝐤 provided in the constructor.

Exceptions
 std::exception if t0 > tf.

The documentation for this class was generated from the following file: