SurgSim::Math::OdeSolverRungeKutta4 Class Reference

Runge Kutta 4 ode solver (See http://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods) solves the following \(2^{nd}\) order ode \(M(x(t), v(t)).a(t) = f(t, x(t), v(t))\). More...

`#include <SurgSim/Math/OdeSolverRungeKutta4.h>`

Inheritance diagram for SurgSim::Math::OdeSolverRungeKutta4:

## Classes

struct | RungeKuttaDerivedState
| Internal structure to hold the 4 temporary evaluations. More...

## Public Member Functions

| OdeSolverRungeKutta4 (OdeEquation *equation)
| Constructor. More...
void | solve (double dt, const OdeState &currentState, OdeState *newState, bool computeCompliance=true) override
| Solves the equation. More...
Public Member Functions inherited from SurgSim::Math::OdeSolver
| OdeSolver (OdeEquation *equation)
| Constructor. More...
virtual | ~OdeSolver ()
| Virtual destructor. More...
const std::string | getName () const
| Gets the solver's name. More...
void | setLinearSolver (std::shared_ptr< LinearSparseSolveAndInverse > linearSolver)
| Sets the specialized linear solver to use with this Ode solver. More...
std::shared_ptr< LinearSparseSolveAndInverse > | getLinearSolver () const
| Gets the specialized linear solver used with this Ode solver. More...
void | computeMatrices (double dt, const OdeState &state, bool computeCompliance=true)
| Computes the system and compliance matrices for a given state. More...
const SparseMatrix & | getSystemMatrix () const
| Queries the current system matrix. More...
const Matrix & | getComplianceMatrix () const

## Protected Member Functions

void | assembleLinearSystem (double dt, const OdeState &state, const OdeState &newState, bool computeRHS=true) override
| Assemble the linear system (A.x=b) to be solved for the state and new states (useful for certain ode solver). More...
Protected Member Functions inherited from SurgSim::Math::OdeSolver
void | computeComplianceMatrixFromSystemMatrix (const OdeState &state)
| Helper method computing the compliance matrix from the system matrix and setting the boundary conditions. More...

## Protected Attributes

RungeKuttaDerivedState | m_k1
RungeKuttaDerivedState | m_k2
RungeKuttaDerivedState | m_k3
RungeKuttaDerivedState | m_k4
Protected Attributes inherited from SurgSim::Math::OdeSolver
std::string | m_name
| Name for this solver. More...
OdeEquation & | m_equation
| The ode equation (API providing the necessary evaluation methods and the initial state) More...
std::shared_ptr< LinearSparseSolveAndInverse > | m_linearSolver
| The specialized linear solver to use when solving the ode equation. More...
SparseMatrix | m_systemMatrix
| Linear system matrix (can be M, K, combination of MDK depending on the solver), including boundary conditions. More...
Vector | m_solution
| Linear system solution and rhs vectors (including boundary conditions) More...
Vector | m_rhs
Matrix | m_complianceMatrix
| Compliance matrix which is the inverse of the system matrix, including boundary conditions. More...

## Detailed Description

Runge Kutta 4 ode solver (See http://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods) solves the following \(2^{nd}\) order ode \(M(x(t), v(t)).a(t) = f(t, x(t), v(t))\).

This ode is solved as an ode of order 1 by defining the state vector \(y = \left(\begin{array}{c}x\\v\end{array}\right)\):

\[ y' = \left(\begin{array}{c} x' \\ v' \end{array}\right) = \left(\begin{array}{c} v \\ M(x, v)^{-1}.f(t,x, v) \end{array}\right) = f(t, y) \]

After integrating this equation, we get:

\[ y(t+dt) - y(t) = \int_t^{t+dt} f(t,y) dt \]

Runge Kutta 4 evaluates the integral term using 4 dependents evaluations of \(f\) at different times and states:

\[ \begin{array}{l} y(t+dt) = y(t) + \frac{dt}{6} (k_1 + 2k_2 + 2k_3 + k_4) \\ \text{with:} \\ \quad \begin{array}{lllllll} k_1 &=& f(& t &,& y(t) &) \\ k_2 &=& f(& t+\frac{dt}{2} &,& y(t) + \frac{dt}{2} k_1 &) \\ k_3 &=& f(& t+\frac{dt}{2} &,& y(t) + \frac{dt}{2} k_2 &) \\ k_4 &=& f(& t+dt &,& y(t) + dt k_3 &) \end{array} \end{array} \]

## Constructor & Destructor Documentation

## OdeSolverRungeKutta4()

SurgSim::Math::OdeSolverRungeKutta4::OdeSolverRungeKutta4 | ( | OdeEquation * | equation | ) |

explicit

Constructor.

Parameters

  equation | The ode equation to be solved

## Member Function Documentation

## assembleLinearSystem()

void SurgSim::Math::OdeSolverRungeKutta4::assembleLinearSystem | ( | double | dt,
|  | const OdeState & | state,
|  | const OdeState & | newState,
|  | bool | computeRHS = `true`
| ) |  |

override protected virtual

Assemble the linear system (A.x=b) to be solved for the state and new states (useful for certain ode solver).

Parameters

  dt | The time step used in the system
  state,newState | The state and newState to be used to evaluate the system
  computeRHS | True to compute the RHS vector, False otherwise

Note
  The method should fill up the LHS matrix in m_systemMatrix and the RHS vector in m_b (if requested)
  The method should take care of the boundary conditions properly on both the matrix and the vector.
  The method should prepare the linear solver m_linearSolver to be used with the m_systemMatrix

Implements SurgSim::Math::OdeSolver.

## solve()

void SurgSim::Math::OdeSolverRungeKutta4::solve | ( | double | dt,
|  | const OdeState & | currentState,
|  | OdeState * | newState,
|  | bool | computeCompliance = `true`
| ) |  |

override virtual

Solves the equation.

Parameters

  | dt | The time step
  | currentState | State at time t
  [out] | newState | State at time t+dt
  | computeCompliance | True to explicitly compute the compliance matrix, False otherwise

Implements SurgSim::Math::OdeSolver.

## Member Data Documentation

## m_k1

RungeKuttaDerivedState SurgSim::Math::OdeSolverRungeKutta4::m_k1

protected

Runge kutta 4 intermediate system evaluation

## m_k2

RungeKuttaDerivedState SurgSim::Math::OdeSolverRungeKutta4::m_k2

protected

Runge kutta 4 intermediate system evaluation

## m_k3

RungeKuttaDerivedState SurgSim::Math::OdeSolverRungeKutta4::m_k3

protected

Runge kutta 4 intermediate system evaluation

## m_k4

RungeKuttaDerivedState SurgSim::Math::OdeSolverRungeKutta4::m_k4

protected

Runge kutta 4 intermediate system evaluation

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

- SurgSim/Math/OdeSolverRungeKutta4.h
- SurgSim/Math/OdeSolverRungeKutta4.cpp