@@ -4,10 +4,8 @@ using DiffEqDevTools, DiffEqBase
4
4
using SimpleDiffEq
5
5
using OrdinaryDiffEqSDIRK, OrdinaryDiffEqVerner, OrdinaryDiffEqTsit5, OrdinaryDiffEqFIRK
6
6
using Ipopt
7
- using BenchmarkTools
8
- using CairoMakie
9
7
using DataInterpolations
10
- const M = ModelingToolkit
8
+ # const M = ModelingToolkit
11
9
12
10
@testset " ODE Solution, no cost" begin
13
11
# Test solving without anything attached.
@@ -26,19 +24,19 @@ const M = ModelingToolkit
26
24
27
25
# Test explicit method.
28
26
jprob = JuMPControlProblem (sys, u0map, tspan, parammap, dt = 0.01 )
29
- @test num_constraints (jprob. model) == 2 # initials
27
+ @test JuMP . num_constraints (jprob. model) == 2 # initials
30
28
jsol = solve (jprob, Ipopt. Optimizer, :RK4 )
31
29
oprob = ODEProblem (sys, u0map, tspan, parammap)
32
30
osol = solve (oprob, SimpleRK4 (), dt = 0.01 )
33
31
@test jsol. sol. u ≈ osol. u
34
32
35
33
# Implicit method.
36
- jsol2 = @btime solve ($ jprob, Ipopt. Optimizer, :ImplicitEuler , silent = true ) # 63.031 ms, 26.49 MiB
37
- osol2 = @btime solve ($ oprob, ImplicitEuler (), dt = 0.01 , adaptive = false ) # 129.375 μs, 61.91 KiB
34
+ jsol2 = solve (jprob, Ipopt. Optimizer, :ImplicitEuler , silent = true ) # 63.031 ms, 26.49 MiB
35
+ osol2 = solve (oprob, ImplicitEuler (), dt = 0.01 , adaptive = false ) # 129.375 μs, 61.91 KiB
38
36
@test ≈ (jsol2. sol. u, osol2. u, rtol = 0.001 )
39
37
iprob = InfiniteOptControlProblem (sys, u0map, tspan, parammap, dt = 0.01 )
40
- isol = @btime solve (
41
- $ iprob, Ipopt . Optimizer, derivative_method = FiniteDifference ( Backward ()), silent = true ) # 11.540 ms, 4.00 MiB
38
+ isol = solve (iprob, Ipopt . Optimizer, derivative_method = InfiniteOpt . FiniteDifference (InfiniteOpt . Backward ()), silent = true ) # 11.540 ms, 4.00 MiB
39
+ @test ≈ (jsol2 . sol . u, osol2 . u, rtol = 0.001 )
42
40
43
41
# With a constraint
44
42
u0map = Pair[]
@@ -47,34 +45,29 @@ const M = ModelingToolkit
47
45
@mtkbuild lksys = ODESystem (eqs, t; constraints = constr)
48
46
49
47
jprob = JuMPControlProblem (lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01 )
50
- @test num_constraints (jprob. model) == 2
51
- jsol = @btime solve ($ jprob, Ipopt. Optimizer, :Tsitouras5 , silent = true ) # 12.190 s, 9.68 GiB
52
- sol = jsol. sol
53
- @test sol (0.6 )[1 ] ≈ 3.5
54
- @test sol (0.3 )[1 ] ≈ 7.0
48
+ @test JuMP. num_constraints (jprob. model) == 2
49
+ jsol = solve (jprob, Ipopt. Optimizer, :Tsitouras5 , silent = true ) # 12.190 s, 9.68 GiB
50
+ @test jsol. sol (0.6 )[1 ] ≈ 3.5
51
+ @test jsol. sol (0.3 )[1 ] ≈ 7.0
55
52
56
53
iprob = InfiniteOptControlProblem (
57
54
lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01 )
58
- isol = @btime solve (
59
- $ iprob, Ipopt. Optimizer, derivative_method = OrthogonalCollocation (3 ), silent = true ) # 48.564 ms, 9.58 MiB
55
+ isol = solve (iprob, Ipopt. Optimizer, derivative_method = InfiniteOpt. OrthogonalCollocation (3 ), silent = true ) # 48.564 ms, 9.58 MiB
60
56
sol = isol. sol
61
57
@test sol (0.6 )[1 ] ≈ 3.5
62
58
@test sol (0.3 )[1 ] ≈ 7.0
63
59
64
60
# Test whole-interval constraints
65
- constr = [x (t) > 3 , y (t) > 4 ]
61
+ constr = [x (t) ≳ 1 , y (t) ≳ 1 ]
66
62
@mtkbuild lksys = ODESystem (eqs, t; constraints = constr)
67
63
iprob = InfiniteOptControlProblem (
68
64
lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01 )
69
- isol = @btime solve (
70
- $ iprob, Ipopt. Optimizer, derivative_method = OrthogonalCollocation (3 ), silent = true ) # 48.564 ms, 9.58 MiB
71
- sol = isol. sol
72
- @test all (u -> u .> [3 , 4 ], sol. u)
65
+ isol = solve (iprob, Ipopt. Optimizer, derivative_method = InfiniteOpt. OrthogonalCollocation (3 ), silent = true ) # 48.564 ms, 9.58 MiB
66
+ @test all (u -> u > [1 , 1 ], isol. sol. u)
73
67
74
68
jprob = JuMPControlProblem (lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01 )
75
- jsol = @btime solve ($ jprob, Ipopt. Optimizer, :RadauIA3 , silent = true ) # 12.190 s, 9.68 GiB
76
- sol = jsol. sol
77
- @test all (u -> u .> [3 , 4 ], sol. u)
69
+ jsol = solve (jprob, Ipopt. Optimizer, :RadauIA3 , silent = true ) # 12.190 s, 9.68 GiB
70
+ @test all (u -> u > [1 , 1 ], jsol. sol. u)
78
71
end
79
72
80
73
function is_bangbang (input_sol, lbounds, ubounds, rtol = 1e-4 )
@@ -186,11 +179,11 @@ end
186
179
g₀ => 1 , m₀ => 1.0 , h_c => 500 , c => 0.5 * √ (g₀ * h₀), D_c => 0.5 * 620 * m₀ / g₀,
187
180
Tₘ => 3.5 * g₀ * m₀, T (t) => 0.0 , h₀ => 1 , m_c => 0.6 ]
188
181
jprob = JuMPControlProblem (rocket, u0map, (ts, te), pmap; dt = 0.005 , cse = false )
189
- jsol = solve (jprob, Ipopt. Optimizer, :RadauIIA3 )
182
+ jsol = solve (jprob, Ipopt. Optimizer, :RadauIIA5 , silent = true )
190
183
@test jsol. sol. u[end ][1 ] > 1.012
191
184
192
185
iprob = InfiniteOptControlProblem (rocket, u0map, (ts, te), pmap; dt = 0.005 , cse = false )
193
- isol = solve (iprob, Ipopt. Optimizer, derivative_method = OrthogonalCollocation (3 ))
186
+ isol = solve (iprob, Ipopt. Optimizer, derivative_method = InfiniteOpt . OrthogonalCollocation (3 ), silent = true )
194
187
@test isol. sol. u[end ][1 ] > 1.012
195
188
196
189
# Test solution
201
194
@mtkbuild rocket_ode = ODESystem (eqs, t)
202
195
interpmap = Dict (T_interp => ctrl_to_spline (jsol. input_sol, CubicSpline))
203
196
oprob = ODEProblem (rocket_ode, u0map, (ts, te), merge (Dict (pmap), interpmap))
204
- osol = solve (oprob, RadauIIA3 () )
205
- @test jsol. sol. u ≈ osol. u
197
+ osol = solve (oprob, RadauIIA5 (); adaptive = false , dt = 0.005 )
198
+ @test ≈ ( jsol. sol. u, osol. u, rtol = 0.02 )
206
199
end
207
200
208
201
@testset " Free final time problem" begin
266
259
end
267
260
268
261
# RC Circuit
269
- @testset " MTK Components" begin
270
- end
271
-
272
- # @testset "Constrained optimal control problems" begin
273
- # end
262
+ # using ModelingToolkitStandardLibrary.Electrical
263
+ # @testset "MTK Components" begin
264
+ # @mtkmodel RL begin
265
+ # @parameters begin
266
+ # R = 1.0
267
+ # L = 1.0
268
+ # end
269
+ # @components begin
270
+ # resistor = Resistor(R = R)
271
+ # inductor = Inductor(L = L)
272
+ # source = Voltage()
273
+ # ground = Ground()
274
+ # end
275
+ # @equations begin
276
+ # connect(source.p, resistor.p)
277
+ # connect(resistor.n, inductor.p)
278
+ # connect(inductor.n, source.n, ground.g)
279
+ # end
280
+ # end
281
+ #
282
+ # costs = []
283
+ # coalesce = sum
284
+ # @named sys = RL()
285
+ # sys, _ = structural_simplify(sys, inputs = [sys.source.V.u])
286
+ # @parameters tf λ i₀
287
+ # end
0 commit comments