Nonlinear bouncing ball

Model

using ReachabilityAnalysis, ModelingToolkit

@taylorize function flow_down!(du, u, params, t)
    du[1] = u[2]
    du[2] = -9.8 + 0.1 * (u[2])^2
    return du
end

@taylorize function flow_up!(du, u, params, t)
    du[1] = u[2]
    du[2] = -9.8 - 0.1 * (u[2])^2
    return du
end

function bouncingBallNonlinear_model()
    var = @variables x, v

    # hybrid automaton with state variables x, v
    HA = GraphAutomaton(2)

    # mode 1 ("down")
    X = HPolyhedron([x ≥ 0, v ≤ 0], vars)
    m1 = @system(x' = flow_down!(x), dim:2, x ∈ X)

    # mode 2 ("up")
    X = HPolyhedron([x ≥ 0, v ≥ 0], vars)
    m2 = @system(x' = flow_up!(x), dim:2, x ∈ X)

    # α transition down → up
    add_transition!(HA, 1, 2, 1)
    G = HalfSpace(x ≤ 0, vars)
    A = [1.0 0.0; 0.0 -0.8]
    Rα = ConstrainedLinearMap(A, G)  # v := -0.8v

    # β transition up → down
    add_transition!(HA, 2, 1, 2)
    G = HalfSpace(v ≤ 0, vars)
    Rβ = ConstrainedIdentityMap(2, G)

    # hybrid system
    S = HybridSystems.HybridSystem(HA, [m1, m2], [Rα, Rβ], fill(AutonomousSwitching(), 2))

    return S
end

function model(X0)
    H = bouncingBallNonlinear_model()
    return IVP(H, X0)
end
model (generic function with 1 method)