@@ -4,10 +4,8 @@ using DiffEqDevTools, DiffEqBase
44using SimpleDiffEq
55using OrdinaryDiffEqSDIRK, OrdinaryDiffEqVerner, OrdinaryDiffEqTsit5, OrdinaryDiffEqFIRK
66using Ipopt
7- using BenchmarkTools
8- using CairoMakie
97using DataInterpolations
10- const M = ModelingToolkit
8+ # const M = ModelingToolkit
119
1210@testset " ODE Solution, no cost" begin
1311 # Test solving without anything attached.
@@ -26,19 +24,19 @@ const M = ModelingToolkit
2624
2725 # Test explicit method.
2826 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
3028 jsol = solve (jprob, Ipopt. Optimizer, :RK4 )
3129 oprob = ODEProblem (sys, u0map, tspan, parammap)
3230 osol = solve (oprob, SimpleRK4 (), dt = 0.01 )
3331 @test jsol. sol. u ≈ osol. u
3432
3533 # 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
3836 @test ≈ (jsol2. sol. u, osol2. u, rtol = 0.001 )
3937 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 )
4240
4341 # With a constraint
4442 u0map = Pair[]
@@ -47,34 +45,29 @@ const M = ModelingToolkit
4745 @mtkbuild lksys = ODESystem (eqs, t; constraints = constr)
4846
4947 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
5552
5653 iprob = InfiniteOptControlProblem (
5754 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
6056 sol = isol. sol
6157 @test sol (0.6 )[1 ] ≈ 3.5
6258 @test sol (0.3 )[1 ] ≈ 7.0
6359
6460 # Test whole-interval constraints
65- constr = [x (t) > 3 , y (t) > 4 ]
61+ constr = [x (t) ≳ 1 , y (t) ≳ 1 ]
6662 @mtkbuild lksys = ODESystem (eqs, t; constraints = constr)
6763 iprob = InfiniteOptControlProblem (
6864 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)
7367
7468 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)
7871end
7972
8073function is_bangbang (input_sol, lbounds, ubounds, rtol = 1e-4 )
@@ -186,11 +179,11 @@ end
186179 g₀ => 1 , m₀ => 1.0 , h_c => 500 , c => 0.5 * √ (g₀ * h₀), D_c => 0.5 * 620 * m₀ / g₀,
187180 Tₘ => 3.5 * g₀ * m₀, T (t) => 0.0 , h₀ => 1 , m_c => 0.6 ]
188181 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 )
190183 @test jsol. sol. u[end ][1 ] > 1.012
191184
192185 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 )
194187 @test isol. sol. u[end ][1 ] > 1.012
195188
196189 # Test solution
201194 @mtkbuild rocket_ode = ODESystem (eqs, t)
202195 interpmap = Dict (T_interp => ctrl_to_spline (jsol. input_sol, CubicSpline))
203196 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 )
206199end
207200
208201@testset " Free final time problem" begin
266259end
267260
268261# 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