Skip to content

Commit 57002f2

Browse files
committed
Plot nominal dynamics for Van der Pol system
1 parent 94618c7 commit 57002f2

File tree

3 files changed

+40
-3
lines changed

3 files changed

+40
-3
lines changed

examples/Project.toml

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ IntervalSySCoRe = "6214ee8e-79dc-449b-ae00-4c9ff82a02a9"
88
LazySets = "b4f0291d-fe17-52bc-9479-3d1a343d9043"
99
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1010
Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
11+
Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
1112
ProgressMeter = "92933f4c-e287-5a05-a399-4b506db050ca"
1213
Revise = "295af30f-e4ad-537b-8983-00126c2a3abe"
1314
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"

examples/systems/van_der_pol.jl

+26-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using Revise
22

3-
using LinearAlgebra, LazySets
3+
using LinearAlgebra, LazySets, Plots
44
using IntervalMDP, IntervalSySCoRe
55

66

@@ -37,6 +37,31 @@ function van_der_pol_decoupled(; state_split=(50, 50), input_split=10)
3737
return mdp, reach, avoid
3838
end
3939

40+
function van_der_pol_plot_nominal()
41+
sys = van_der_pol_sys()
42+
43+
X = Hyperrectangle(low=[-4.0, -4.0], high=[4.0, 4.0])
44+
state_abs = StateUniformGridSplit(X, (50, 50))
45+
46+
U = Hyperrectangle(low=[-1.0], high=[1.0])
47+
input_abs = InputLinRange(U, 10)
48+
49+
R = IntervalSySCoRe.regions(state_abs)[837]
50+
u = IntervalSySCoRe.inputs(input_abs)[3]
51+
52+
Y = nominal(dynamics(sys), R, u)
53+
54+
xs = sample(R, 10)
55+
ys = [nominal(dynamics(sys), x, element(u)) for x in xs]
56+
57+
p = plot(R, color=:blue, label="X")
58+
scatter!(p, Plots.unzip(Tuple.(xs)), color=:blue, label="Xhat", markershape=:xcross)
59+
plot!(p, Y, color=:red, label="Y")
60+
scatter!(p, Plots.unzip(Tuple.(ys)), color=:red, label="Yhat", markershape=:xcross)
61+
62+
display(p)
63+
end
64+
4065
function main()
4166
@time "abstraction" mdp, reach, avoid = van_der_pol_decoupled(; state_split=(200, 200), input_split=21)
4267

src/dynamics/NonlinearAdditiveNoiseDynamics.jl

+13-2
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,9 @@ function nominal(dyn::NonlinearAdditiveNoiseDynamics, X::Hyperrectangle, U::Hype
9090
return Yconv
9191
end
9292

93-
function nominal(dyn::NonlinearAdditiveNoiseDynamics, X::Hyperrectangle, U::Singleton)
93+
nominal(dyn::NonlinearAdditiveNoiseDynamics, X::Hyperrectangle, U::Singleton) = nominal(dyn, X, element(U))
94+
95+
function nominal(dyn::NonlinearAdditiveNoiseDynamics, X::Hyperrectangle, u::AbstractVector)
9496
# Use the Taylor model to over-approximate the reachable set
9597
order = 1
9698

@@ -102,7 +104,6 @@ function nominal(dyn::NonlinearAdditiveNoiseDynamics, X::Hyperrectangle, U::Sing
102104
set_variables(Float64, "x"; order=2order, numvars=dimstate(dyn))
103105

104106
x = [TaylorModelN(i, order, IntervalBox(x0), dom) for i in 1:dimstate(dyn)]
105-
u = element(U)
106107

107108
# Perform the Taylor expansion
108109
y = dyn.f(x, u)
@@ -127,7 +128,17 @@ function nominal(dyn::NonlinearAdditiveNoiseDynamics, X::Hyperrectangle, U::Sing
127128
return Yconv
128129
end
129130

131+
function nominal(dyn::NonlinearAdditiveNoiseDynamics, X::Singleton, U::Singleton)
132+
x = element(X)
133+
u = element(U)
134+
135+
y = dyn.f(x, u)
136+
137+
return Singleton(y)
138+
end
139+
130140

141+
nominal(dyn::NonlinearAdditiveNoiseDynamics, x::AbstractVector, u::AbstractVector) = dyn.f(x, u)
131142

132143
noise(dyn::NonlinearAdditiveNoiseDynamics) = dyn.w
133144
dimstate(dyn::NonlinearAdditiveNoiseDynamics) = dyn.nstate

0 commit comments

Comments
 (0)