-
Notifications
You must be signed in to change notification settings - Fork 37
Description
If Z1
and Z2
are zonotopes, their convex hull is a polytope but not a zonotope, in general. For instance, let:
using LazySets, Plots
Z1 = Zonotope(ones(2), [[1., 0.], [0., 1.], [1., 1.]])
Z2 = Zonotope(-ones(2), [[.5, 1.], [-.1, .9], [1., 4.]])
Y = ConvexHull(Z1, Z2)
plot([Z1, Z2], alpha=.1)
plot!(Y, 1e-2, alpha=.1)
The convex hull Y
was computed above using a polygonal approximation. As discussed in [Reachability of Uncertain Linear Systems Using Zonotopes, A. Girard, HSCC 2005], the set Y
can be overapproximated with a zonotope as follows:
center = (Z1.center+Z2.center)/2
generators = [(Z1.generators .+ Z2.generators) (Z1.center - Z2.center) (Z1.generators .- Z2.generators)]/2
Z3 = Zonotope(center, generators)
plot!(Z3, alpha=0.1)
It is also noted that Z3
is not necessarily the minimal enclosing zonotope, which is in general expensive in high dimensions and it is investigated in [Zonotopes as bounding volumes, L. J. Guibas et al, PRoc. of Symposium on Discrete Algorithms, pp 803-812].
We could define:
function overapproximate(S::ConvexHull{N, Zonotope{N}, Zonotope{N}}, ::Type{<:Zonotope})::Zonotope where {N<:Real}
Z1, Z2 = S.X, S.Y
center = (Z1.center+Z2.center)/2
generators = [(Z1.generators .+ Z2.generators) (Z1.center - Z2.center) (Z1.generators .- Z2.generators)]/2
return Zonotope(center, generators)
end
that implements this function. What do you think?
Another approach for the API is to introduce some sort of new name convex_hull_overapproximation
.. but i think that it is better to exploit the existent ones (so long as we are coherent).