@@ -6,6 +6,7 @@ using OrdinaryDiffEqSDIRK
6
6
using Ipopt
7
7
using BenchmarkTools
8
8
using CairoMakie
9
+ using DataInterpolations
9
10
const M = ModelingToolkit
10
11
11
12
@testset " ODE Solution, no cost" begin
@@ -76,21 +77,26 @@ const M = ModelingToolkit
76
77
@test all (u -> u .> [3 , 4 ], sol. u)
77
78
end
78
79
79
- @testset " Linear systems" begin
80
- function is_bangbang (input_sol, lbounds, ubounds, rtol = 1e-4 )
81
- bangbang = true
82
- for v in 1 : (length (input_sol. u[1 ]) - 1 )
83
- all (i -> ≈ (i[v], bounds[v]; rtol) || ≈ (i[v], bounds[u]; rtol), input_sol. u) ||
84
- (bangbang = false )
85
- end
86
- bangbang
80
+ function is_bangbang (input_sol, lbounds, ubounds, rtol = 1e-4 )
81
+ for v in 1 : (length (input_sol. u[1 ]) - 1 )
82
+ all (i -> ≈ (i[v], bounds[v]; rtol) || ≈ (i[v], bounds[u]; rtol), input_sol. u) ||
83
+ return false
87
84
end
85
+ true
86
+ end
87
+
88
+ function ctrl_to_spline (inputsol, splineType)
89
+ us = reduce (vcat, inputsol. u)
90
+ ts = reduce (vcat, inputsol. t)
91
+ splineType (us, ts)
92
+ end
88
93
94
+ @testset " Linear systems" begin
89
95
# Double integrator
90
96
t = M. t_nounits
91
97
D = M. D_nounits
92
98
@variables x (.. ) [bounds = (0.0 , 0.25 )] v (.. )
93
- @variables u (t ) [bounds = (- 1.0 , 1.0 ), input = true ]
99
+ @variables u (.. ) [bounds = (- 1.0 , 1.0 ), input = true ]
94
100
constr = [v (1.0 ) ~ 0.0 ]
95
101
cost = [- x (1.0 )] # Maximize the final distance.
96
102
@named block = ODESystem (
99
105
100
106
u0map = [x (t) => 0.0 , v (t) => 0.0 ]
101
107
tspan = (0.0 , 1.0 )
102
- parammap = [u => 0.0 ]
108
+ parammap = [u (t) => 0.0 ]
103
109
jprob = JuMPControlProblem (block, u0map, tspan, parammap; dt = 0.01 )
104
110
jsol = solve (jprob, Ipopt. Optimizer, :Verner8 )
105
111
# Linear systems have bang-bang controls
106
112
@test is_bangbang (jsol. input_sol, [- 1.0 ], [1.0 ])
107
113
# Test reached final position.
108
114
@test ≈ (jsol. sol. u[end ][1 ], 0.25 , rtol = 1e-5 )
115
+ # Test dynamics
116
+ @parameters (u_interp:: LinearInterpolation )(.. )
117
+ block_ode = ODESystem ([D (x (t)) ~ v (t), D (v (t)) ~ u_interp (t)], t)
118
+ spline = ctrl_to_spline (jsol. input_sol, LinearInterpolation)
119
+ oprob = ODEProblem (block, u0map, tspan, [u_interp => spline])
120
+ osol = solve (oprob, Vern8 ())
121
+ @test jsol. sol. u ≈ osol. u
109
122
110
123
iprob = InfiniteOptControlProblem (block, u0map, tspan, parammap; dt = 0.01 )
111
124
isol = solve (iprob, Ipopt. Optimizer; silent = true )
112
125
@test is_bangbang (isol. input_sol, [- 1.0 ], [1.0 ])
113
126
@test ≈ (isol. sol. u[end ][1 ], 0.25 , rtol = 1e-5 )
127
+ osol = solve (oprob, ImplicitEuler ())
128
+ @test isol. sol. u ≈ osol. u
114
129
115
130
# ##################
116
131
# ## Bee example ###
133
148
jsol = solve (jprob, Ipopt. Optimizer, :Tsitouras5 )
134
149
@test is_bangbang (jsol. input_sol, [0.0 ], [1.0 ])
135
150
iprob = InfiniteOptControlProblem (beesys, u0map, tspan, pmap, dt = 0.01 )
136
- isol = solve (jprob , Ipopt. Optimizer, :Tsitouras5 )
151
+ isol = solve (iprob , Ipopt. Optimizer; silent = true )
137
152
@test is_bangbang (isol. input_sol, [0.0 ], [1.0 ])
153
+
154
+ @parameters (α_interp:: LinearInterpolation )(.. )
155
+ eqs = [D (w (t)) ~ - μ * w (t) + b * s * α_interp (t) * w (t),
156
+ D (q (t)) ~ - ν * q (t) + c * (1 - α_interp (t)) * s * w (t)]
157
+ beesys_ode = ODESystem (eqs, t)
158
+ oprob = ODEProblem (beesys_ode, u0map, tspan, [α_interp => ctrl_to_spline (jsol. input_sol, LinearInterpolation)])
159
+ osol = solve (oprob, Tsit5 ())
160
+ @test osol. u ≈ jsol. sol. u
138
161
end
139
162
140
163
@testset " Rocket launch" begin
163
186
jprob = JuMPControlProblem (rocket, u0map, (ts, te), pmap; dt = 0.005 , cse = false )
164
187
jsol = solve (jprob, Ipopt. Optimizer, :RadauIA3 )
165
188
@test jsol. sol. u[end ][1 ] > 1.012
189
+
190
+ # Test solution
191
+ @parameters (T_interp:: CubicSpline )(.. )
192
+ eqs = [D (h (t)) ~ v (t),
193
+ D (v (t)) ~ (T_interp (t) - drag (h (t), v (t))) / m (t) - gravity (h (t)),
194
+ D (m (t)) ~ - T_interp (t) / c]
195
+ rocket_ode = ODESystem (eqs, t)
196
+ interpmap = Dict (T_interp => ctrl_to_spline (jsol. inputsol, CubicSpline))
197
+ oprob = ODEProblem (rocket_ode, u0map, tspan, merge (pmap, interpmap))
198
+ osol = solve (oprob, RadauIA3 ())
199
+ @test jsol. sol. u ≈ osol. u
166
200
end
167
201
168
202
@testset " Free final time problem" begin
189
223
@test isapprox (isol. sol. t[end ], 10.0 , rtol = 1e-3 )
190
224
end
191
225
226
+ using JuliaSimCompiler
227
+ using Multibody. PlanarMechanics
228
+
229
+ @testset " Cart-pole problem" begin
230
+ end
231
+
192
232
# @testset "Constrained optimal control problems" begin
193
233
# end
0 commit comments