Symbolic Metadata
It is possible to add metadata to symbolic variables, the metadata will be displayed when calling help on a variable.
The following information can be added (note, it's possible to extend this to user-defined metadata as well)
Variable descriptions
Descriptive strings can be attached to variables using the [description = "descriptive string"] syntax:
using ModelingToolkit
@variables u [description = "This is my input"]
getdescription(u)"This is my input"When variables with descriptions are present in systems, they will be printed when the system is shown in the terminal:
@parameters t
@variables u(t) [description = "A short description of u"]
@parameters p [description = "A description of p"]
@named sys = ODESystem([u ~ p], t)Model sys with 1 equations
States (1):
u(t): A short description of u
Parameters (1):
p: A description of pCalling help on the variable u displays the description, alongside other metadata:
help?> u
A variable of type Symbolics.Num (Num wraps anything in a type that is a subtype of Real)
Metadata
≡≡≡≡≡≡≡≡≡≡
ModelingToolkit.VariableDescription: This is my input
Symbolics.VariableSource: (:variables, :u)Connect
Variables in connectors can have connect metadata which describes the type of connections.
Flow is used for variables that represent physical quantities that "flow" ex: current in a resistor. These variables sum up to zero in connections.
Stream can be specified for variables that flow bi-directionally.
using ModelingToolkit
@variables t, i(t) [connect = Flow]
@variables k(t) [connect = Stream]\[ \begin{equation} \left[ \begin{array}{c} k\left( t \right) \\ \end{array} \right] \end{equation} \]
Input or output
Designate a variable as either an input or an output using the following
using ModelingToolkit
@variables u [input = true]
isinput(u)true@variables y [output = true]
isoutput(y)trueBounds
Bounds are useful when parameters are to be optimized, or to express intervals of uncertainty.
@variables u [bounds = (-1, 1)]
hasbounds(u)truegetbounds(u)(-1, 1)Guess
Specify an initial guess for custom initial conditions of an ODESystem.
@variables u [guess = 1]
hasguess(u)truegetguess(u)1Mark input as a disturbance
Indicate that an input is not available for control, i.e., it's a disturbance input.
@variables u [input = true, disturbance = true]
isdisturbance(u)trueMark parameter as tunable
Indicate that a parameter can be automatically tuned by parameter optimization or automatic control tuning apps.
@parameters Kp [tunable = true]
istunable(Kp)trueProbability distributions
A probability distribution may be associated with a parameter to indicate either uncertainty about its value, or as a prior distribution for Bayesian optimization.
using Distributions
d = Normal(10, 1)
@parameters m [dist = d]
hasdist(m)getdist(m)Additional functions
For systems that contain parameters with metadata like described above, have some additional functions defined for convenience. In the example below, we define a system with tunable parameters and extract bounds vectors
@parameters t
Dₜ = Differential(t)
@variables x(t)=0 u(t)=0 [input = true] y(t)=0 [output = true]
@parameters T [tunable = true, bounds = (0, Inf)]
@parameters k [tunable = true, bounds = (0, Inf)]
eqs = [Dₜ(x) ~ (-x + k * u) / T # A first-order system with time constant T and gain k
y ~ x]
sys = ODESystem(eqs, t, name = :tunable_first_order)\[ \begin{align} \frac{\mathrm{d} x\left( t \right)}{\mathrm{d}t} =& \frac{ - x\left( t \right) + k u\left( t \right)}{T} \\ y\left( t \right) =& x\left( t \right) \end{align} \]
p = tunable_parameters(sys) # extract all parameters marked as tunable2-element Vector{SymbolicUtils.BasicSymbolic{Real}}:
k
Tlb, ub = getbounds(p) # operating on a vector, we get lower and upper bound vectors(lb = [0, 0], ub = [Inf, Inf])b = getbounds(sys) # Operating on the system, we get a dictDict{SymbolicUtils.BasicSymbolic{Real}, Tuple{Int64, Float64}} with 2 entries:
k => (0, Inf)
T => (0, Inf)Index
ModelingToolkit.getboundsModelingToolkit.getboundsModelingToolkit.getboundsModelingToolkit.getdescriptionModelingToolkit.getdistModelingToolkit.getguessModelingToolkit.hasboundsModelingToolkit.hasdistModelingToolkit.hasguessModelingToolkit.isbinaryvarModelingToolkit.isdisturbanceModelingToolkit.isintegervarModelingToolkit.istunableModelingToolkit.tunable_parametersModelingToolkit.@brownian
Docstrings
ModelingToolkit.getbounds — Functiongetbounds(sys::ModelingToolkit.AbstractSystem, p = parameters(sys))Returns a dict with pairs p => (lb, ub) mapping parameters of sys to lower and upper bounds. Create parameters with bounds like this
@parameters p [bounds=(-1, 1)]To obtain state bounds, call getbounds(sys, states(sys))
ModelingToolkit.getbounds — Methodlb, ub = getbounds(p::AbstractVector)Return vectors of lower and upper bounds of parameter vector p. Create parameters with bounds like this
@parameters p [bounds=(-1, 1)]See also tunable_parameters, hasbounds
ModelingToolkit.getbounds — Methodgetbounds(x)Get the bounds associated with symbolic variable x. Create parameters with bounds like this
@parameters p [bounds=(-1, 1)]ModelingToolkit.getdescription — Methodgetdescription(x)Return any description attached to variables x. If no description is attached, an empty string is returned.
ModelingToolkit.getdist — Methodgetdist(x)Get the probability distribution associated with symbolic variable x. If no distribution is associated with x, nothing is returned. Create parameters with associated distributions like this
using Distributions
d = Normal(0, 1)
@parameters u [dist = d]
hasdist(u) # true
getdist(u) # retrieve distributionModelingToolkit.getguess — Methodgetguess(x)Get the guess for the initial value associated with symbolic variable x. Create variables with a guess like this
@variables x [guess=1]ModelingToolkit.hasbounds — Methodhasbounds(x)Determine whether symbolic variable x has bounds associated with it. See also getbounds.
ModelingToolkit.hasdist — Methodhasdist(x)Determine whether symbolic variable x has a probability distribution associated with it.
ModelingToolkit.hasguess — Methodhasguess(x)Determine whether symbolic variable x has a guess associated with it. See also getguess.
ModelingToolkit.isbinaryvar — Methodisbinaryvar(x)Determine if a variable is binary.
ModelingToolkit.isdisturbance — Methodisdisturbance(x)Determine whether symbolic variable x is marked as a disturbance input.
ModelingToolkit.isintegervar — Methodisintegervar(x)Determine if a variable is an integer.
ModelingToolkit.istunable — Functionistunable(x, default = false)Determine whether symbolic variable x is marked as a tunable for an automatic tuning algorithm.
default indicates whether variables without tunable metadata are to be considered tunable or not.
Create a tunable parameter by
@parameters u [tunable=true]See also tunable_parameters, getbounds
ModelingToolkit.tunable_parameters — Functiontunable_parameters(sys, p = parameters(sys); default=false)Get all parameters of sys that are marked as tunable.
Keyword argument default indicates whether variables without tunable metadata are to be considered tunable or not.
Create a tunable parameter by
@parameters u [tunable=true]ModelingToolkit.@brownian — MacroDefine one or more Brownian variables.