API of the Flow function
CTFlows.Flow — FunctionFlow(
vf::VectorField;
alg,
abstol,
reltol,
saveat,
internalnorm,
kwargs_Flow...
) -> CTFlowsODE.VectorFieldFlow
Constructs a flow object for a classical (non-Hamiltonian) vector field.
This creates a VectorFieldFlow that integrates the ODE system dx/dt = vf(t, x, v) using DifferentialEquations.jl. It handles both fixed and parametric dynamics, as well as jump discontinuities and event stopping.
Keyword Arguments
alg,abstol,reltol,saveat,internalnorm: Solver options.kwargs_Flow...: Additional arguments passed to the solver configuration.
Example
julia> vf(t, x, v) = -v * x
julia> flow = CTFlows.Flow(CTFlows.VectorField(vf))
julia> x1 = flow(0.0, 1.0, 1.0)Flow(
h::CTFlows.AbstractHamiltonian;
alg,
abstol,
reltol,
saveat,
internalnorm,
kwargs_Flow...
) -> CTFlowsODE.HamiltonianFlow
Constructs a Hamiltonian flow from a scalar Hamiltonian.
This method builds a numerical integrator that simulates the evolution of a Hamiltonian system given a Hamiltonian function h(t, x, p, l) or h(x, p).
Internally, it computes the right-hand side of Hamilton’s equations via automatic differentiation and returns a HamiltonianFlow object.
Keyword Arguments
alg,abstol,reltol,saveat,internalnorm: solver options.kwargs_Flow...: forwarded to the solver.
Example
julia> H(x, p) = dot(p, p) + dot(x, x)
julia> flow = CTFlows.Flow(CTFlows.Hamiltonian(H))
julia> xf, pf = flow(0.0, x0, p0, 1.0)Flow(
hv::HamiltonianVectorField;
alg,
abstol,
reltol,
saveat,
internalnorm,
kwargs_Flow...
) -> CTFlowsODE.HamiltonianFlow
Constructs a Hamiltonian flow from a precomputed Hamiltonian vector field.
This method assumes you already provide the Hamiltonian vector field (dx/dt, dp/dt) instead of deriving it from a scalar Hamiltonian.
Returns a HamiltonianFlow object that integrates the given system.
Keyword Arguments
alg,abstol,reltol,saveat,internalnorm: solver options.kwargs_Flow...: forwarded to the solver.
Example
julia> hv(t, x, p, l) = (∇ₚH, -∇ₓH)
julia> flow = CTFlows.Flow(CTFlows.HamiltonianVectorField(hv))
julia> xf, pf = flow(0.0, x0, p0, 1.0, l)Flow(
ocp::Model,
u::CTFlows.ControlLaw;
alg,
abstol,
reltol,
saveat,
internalnorm,
kwargs_Flow...
) -> Union{CTFlowsODE.OptimalControlFlow{CTFlows.Fixed}, CTFlowsODE.OptimalControlFlow{CTFlows.NonFixed}}
Construct a flow for an optimal control problem using a given control law.
This method builds the Hamiltonian system associated with the optimal control problem (ocp) and integrates the corresponding state–costate dynamics using the specified control law u.
Arguments
ocp::CTModels.Model: An optimal control problem defined usingCTModels.u::CTFlows.ControlLaw: A feedback control law generated byControlLaw(...)or similar.alg: Integration algorithm (default inferred).abstol: Absolute tolerance for the ODE solver.reltol: Relative tolerance for the ODE solver.saveat: Time points at which to save the solution.internalnorm: Optional norm function used by the integrator.kwargs_Flow: Additional keyword arguments passed to the solver.
Returns
A flow object f such that:
f(t0, x0, p0, tf)integrates the state and costate fromt0totf.f((t0, tf), x0, p0)returns the full trajectory over the interval.
Example
julia> u = (x, p) -> p
julia> f = Flow(ocp, ControlLaw(u))Flow(
ocp::Model,
u::Function;
autonomous,
variable,
alg,
abstol,
reltol,
saveat,
internalnorm,
kwargs_Flow...
) -> Union{CTFlowsODE.OptimalControlFlow{CTFlows.Fixed}, CTFlowsODE.OptimalControlFlow{CTFlows.NonFixed}}
Construct a flow for an optimal control problem using a control function in feedback form.
This method constructs the Hamiltonian and integrates the associated state–costate dynamics using a raw function u. It automatically wraps u as a control law.
Arguments
ocp::CTModels.Model: The optimal control problem.u::Function: A feedback control function:- If
ocpis autonomous:u(x, p) - If non-autonomous:
u(t, x, p)
- If
autonomous::Bool: Whether the control law depends on time.variable::Bool: Whether the OCP involves variable time (e.g., free final time).alg,abstol,reltol,saveat,internalnorm: ODE solver parameters.kwargs_Flow: Additional options.
Returns
A Flow object compatible with function call interfaces for state propagation.
Example
julia> u = (t, x, p) -> t + p
julia> f = Flow(ocp, u)Flow(
ocp::Model,
u::Union{CTFlows.ControlLaw{<:Function, T, V}, CTFlows.FeedbackControl{<:Function, T, V}},
g::Union{CTFlows.MixedConstraint{<:Function, T, V}, CTFlows.StateConstraint{<:Function, T, V}},
μ::CTFlows.Multiplier{<:Function, T, V};
alg,
abstol,
reltol,
saveat,
internalnorm,
kwargs_Flow...
) -> Union{CTFlowsODE.OptimalControlFlow{CTFlows.Fixed}, CTFlowsODE.OptimalControlFlow{CTFlows.NonFixed}}
Construct a flow for an optimal control problem with control and constraint multipliers in feedback form.
This variant constructs a Hamiltonian system incorporating both the control law and a multiplier law (e.g., for enforcing state or mixed constraints). All inputs must be consistent in time dependence.
Arguments
ocp::CTModels.Model: The optimal control problem.u::ControlLaw or FeedbackControl: Feedback control.g::StateConstraint or MixedConstraint: Constraint function.μ::Multiplier: Multiplier function.alg,abstol,reltol,saveat,internalnorm: Solver settings.kwargs_Flow: Additional options.
Returns
A Flow object that integrates the constrained Hamiltonian dynamics.
Example
julia> f = Flow(ocp, (x, p) -> p[1], (x, u) -> x[1] - 1, (x, p) -> x[1]+p[1])For non-autonomous cases:
julia> f = Flow(ocp, (t, x, p) -> t + p, (t, x, u) -> x - 1, (t, x, p) -> x+p)Flow(
ocp::Model,
u::Function,
g::Function,
μ::Function;
autonomous,
variable,
alg,
abstol,
reltol,
saveat,
internalnorm,
kwargs_Flow...
) -> Union{CTFlowsODE.OptimalControlFlow{CTFlows.Fixed}, CTFlowsODE.OptimalControlFlow{CTFlows.NonFixed}}
Construct a flow from a raw feedback control, constraint, and multiplier.
This version is for defining flows directly from user functions without wrapping them into ControlLaw, Constraint, or Multiplier types. Automatically wraps and adapts them based on time dependence.
Arguments
ocp::CTModels.Model: The optimal control problem.u::Function: Control law.g::Function: Constraint.μ::Function: Multiplier.autonomous::Bool: Whether the system is autonomous.variable::Bool: Whether time is a free variable.alg,abstol,reltol,saveat,internalnorm: Solver parameters.kwargs_Flow: Additional options.
Returns
A Flow object ready for trajectory integration.
Flow(
dyn::Function;
autonomous,
variable,
alg,
abstol,
reltol,
saveat,
internalnorm,
kwargs_Flow...
) -> CTFlowsODE.ODEFlow
Constructs a Flow from a user-defined dynamical system given as a Julia function.
This high-level interface handles:
- autonomous and non-autonomous systems,
- presence or absence of additional variables (
v), - selection of ODE solvers and tolerances,
- and integrates with the CTFlows event system (e.g., jumps, callbacks).
Arguments
dyn: A function defining the vector field. Its signature must match the values ofautonomousandvariable.autonomous: Whether the dynamics are time-independent (falseby default).variable: Whether the dynamics depend on a control or parameterv.alg,abstol,reltol,saveat,internalnorm: Solver settings passed toOrdinaryDiffEq.solve.kwargs_Flow: Additional keyword arguments passed to the solver.
Returns
An ODEFlow object, wrapping both the full solver and its right-hand side (RHS).
Supported Function Signatures for dyn
Depending on the (autonomous, variable) flags:
(false, false):dyn(x)(false, true):dyn(x, v)(true, false):dyn(t, x)(true, true):dyn(t, x, v)
Example
julia> dyn(t, x, v) = [-x[1] + v[1] * sin(t)]
julia> flow = CTFlows.Flow(dyn; autonomous=true, variable=true)
julia> xT = flow((0.0, 1.0), [1.0], [0.1])