Zonotope
LazySets.Zonotope — Type.Zonotope{N<:Real, VN<:AbstractVector{N}, MN<:AbstractMatrix{N}} <: AbstractZonotope{N}Type that represents a zonotope.
Fields
center– center of the zonotopegenerators– matrix; each column is a generator of the zonotope
Notes
Mathematically, a zonotope is defined as the set
where $c \in \mathbb{R}^n$ is its center and $\{g_i\}_{i=1}^p$, $g_i \in \mathbb{R}^n$, is the set of generators. This characterization defines a zonotope as the finite Minkowski sum of line segments. Zonotopes can be equivalently described as the image of a unit infinity-norm ball in $\mathbb{R}^n$ by an affine transformation.
Zonotopes can be constructed in two different ways: either passing the generators as a matrix, where each column represents a generator, or passing a list of vectors where each vector represents a generator. Below we illustrate both ways.
Examples
A two-dimensional zonotope with given center and set of generators:
julia> Z = Zonotope([1.0, 0.0], [0.1 0.0; 0.0 0.1])
Zonotope{Float64,Array{Float64,1},Array{Float64,2}}([1.0, 0.0], [0.1 0.0; 0.0 0.1])
julia> dim(Z)
2
julia> center(Z)
2-element Array{Float64,1}:
1.0
0.0
julia> genmat(Z)
2×2 Array{Float64,2}:
0.1 0.0
0.0 0.1Here, the first vector in the Zonotope constructor corresponds to the zonotope's center, and each column of the second argument corresponds to a generator. The functions center and genmat return the center and the generator matrix of this zonotope respectively.
We can collect its vertices using vertices_list:
julia> vertices_list(Z)
4-element Array{Array{Float64,1},1}:
[1.1, 0.1]
[0.9, 0.1]
[0.9, -0.1]
[1.1, -0.1]The support vector along a given direction can be computed using σ (resp. the support function can be computed using ρ):
julia> σ([1., 1.], Z)
2-element Array{Float64,1}:
1.1
0.1Zonotopes admit an alternative constructor that receives a list of vectors, each vector representing a generator:
julia> Z = Zonotope(ones(2), [[1., 0.], [0., 1.], [1., 1.]])
Zonotope{Float64,Array{Float64,1},Array{Float64,2}}([1.0, 1.0], [1.0 0.0 1.0; 0.0 1.0 1.0])
julia> genmat(Z)
2×3 Array{Float64,2}:
1.0 0.0 1.0
0.0 1.0 1.0LazySets.center — Method.center(Z::Zonotope{N}) where {N<:Real}Return the center of a zonotope.
Input
Z– zonotope
Output
The center of the zonotope.
Base.rand — Method.rand(::Type{Zonotope}; [N]::Type{<:Real}=Float64, [dim]::Int=2,
[rng]::AbstractRNG=GLOBAL_RNG, [seed]::Union{Int, Nothing}=nothing)Create a random zonotope.
Input
Zonotope– type for dispatchN– (optional, default:Float64) numeric typedim– (optional, default: 2) dimensionrng– (optional, default:GLOBAL_RNG) random number generatorseed– (optional, default:nothing) seed for reseedingnum_generators– (optional, default:-1) number of generators of the zonotope (see comment below)
Output
A random zonotope.
Algorithm
All numbers are normally distributed with mean 0 and standard deviation 1.
The number of generators can be controlled with the argument num_generators. For a negative value we choose a random number in the range dim:2*dim (except if dim == 1, in which case we only create a single generator).
LazySets.generators — Method.generators(Z::Zonotope)Return an iterator over the generators of a zonotope.
Input
Z– zonotope
Output
An iterator over the generators of Z.
LazySets.genmat — Method.genmat(Z::Zonotope)
Return the generator matrix of a zonotope.
Input
Z– zonotope
Output
A matrix where each column represents one generator of the zonotope Z.
LazySets.scale — Method.scale(α::Real, Z::Zonotope)Concrete scaling of a zonotope.
Input
α– scalarZ– zonotope
Output
The zonotope obtained by applying the numerical scale to the center and generators of $Z$.
LazySets.ngens — Method.ngens(Z::Zonotope)Return the number of generators of a zonotope.
Input
Z– zonotope
Output
Integer representing the number of generators.
LazySets.togrep — Method.togrep(Z::Zonotope)Return a generator representation of a zonotope.
Input
Z– zonotopic set
Output
The same set Z.
LazySets.reduce_order — Method.reduce_order(Z::Zonotope, r::Union{Integer, Rational})Reduce the order of a zonotope by overapproximating with a zonotope with less generators.
Input
Z– zonotoper– desired order
Output
A new zonotope with less generators, if possible.
Algorithm
See overapproximate(Z::Zonotope{N}, ::Type{<:Zonotope}, r::Union{Integer, Rational}) where {N<:Real} for details.
Base.split — Method.split(Z::Zonotope, j::Int)Return two zonotopes obtained by splitting the given zonotope.
Input
Z– zonotopej– index of the generator to be split
Output
The zonotope obtained by splitting Z into two zonotopes such that their union is Z and their intersection is possibly non-empty.
Algorithm
This function implements [Prop. 3, 1], that we state next. The zonotope $Z = ⟨c, g^{(1, …, p)}⟩$ is split into:
such that $Z₁ ∪ Z₂ = Z$ and $Z₁ ∩ Z₂ = Z^*$, where
[1] Althoff, M., Stursberg, O., & Buss, M. (2008). Reachability analysis of nonlinear systems with uncertain parameters using conservative linearization. In Proc. of the 47th IEEE Conference on Decision and Control.
LazySets.remove_zero_generators — Method.remove_zero_generators(Z::Zonotope{N, VN, MN}) where {N<:Real,
VN<:AbstractVector{N},
MN<:AbstractMatrix{N}}Return a new zonotope removing the generators which are zero of the given zonotope.
Input
Z– zonotope
Output
If there are no zero generators, the result is the original zonotope Z. Otherwise the result is a new zonotope that has the center and generators as Z except for those generators that are zero.
Inherited from LazySet:
Inherited from AbstractPolytope:
Inherited from AbstractCentrallySymmetricPolytope:
Inherited from AbstractZonotope: