Objective#
Optimal control problems in Dymos are posed within the context of phases.
When using an optimizer-based transcription, (Gauss-Lobatto or Radau without solve_segments=forward
), the user is required to provide an objective somewhere in the problem, even for a simple initial value problem.
To support objectives, phases use an overridden version of OpenMDAO’s add_objective
method.
This method handles a few complexities that would be involved in the standard OpenMDAO
add_objective
method.
First, since the path to a variable within the phase might depend on the transcription used, the
add_objective
method uses the same name-detection capability as other phase methods like
add_boundary_constraint
and add_path_constraint
. The name provided should be one of
time
the name of a state variable
the name of a control variable
the name of a control rate or rate2 (second derivative)
the path of an output in the ODE relative to the top level of the ODE
an expression that is a combination of any of the above in the form of an equation
Dymos will find the full path of the given variable and add it to the problem as an objective.
Note
Many optimizers do not support multiple objective functions. When constructing a composite objective you may need to form the objective as an output of a component in your ODE system.
Second, unlike typical OpenMDAO problems where the index
can be used to effectively specify
the first or last value of a variable, optimal control problems have two competing notions of index:
the first is the location in time where the objective is to be measured, and the second is the index of a
vector valued variable that is to be considered the objective value, which must be scalar.
To remove this ambiguity, the add_objective
method on phase has an argument loc
, which may
have value initial
or final
, specifying whether the objective is to be quantified at the
start or end of the phase. The index
option gives the index into a non-scalar variable value
to be used as the objective, which must be scalar.
Example: Minimizing Final Time#
phase.add_objective('time', loc='final')
Example: Maximizing Final Mass#
This example assumes that the phase has a state variable named mass.
phase.add_objective('mass', loc='final', scaler=-1)
Example: Minimizing Final Displacement#
This example assumes that the phase has a state variable named x. Here, disp is added to the timeseries and the final value computed is minimized
phase.add_objective('disp=x**2', loc='final')