Skip to content

Convex hull of two zonotopes #229

@mforets

Description

@mforets

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)

screen shot 2018-02-09 at 22 02 00

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)

screen shot 2018-02-09 at 22 02 05

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).

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions