@@ -44,6 +44,9 @@ const M = ModelingToolkit
4444 @test ≈ (isol. sol. u, osol2. u, rtol = 0.001 )
4545 csol2 = solve (cprob, CasADiCollocation (" ipopt" , constructImplicitEuler ()))
4646 @test ≈ (csol2. sol. u, osol2. u, rtol = 0.001 )
47+ pprob = PyomoDynamicOptProblem (sys, u0map, tspan, parammap, dt = 0.01 )
48+ psol = solve (cprob, PyomoCollocation (" ipopt" , BackwardEuler ()))
49+ @test psol. sol. u ≈ osol2. u
4750
4851 # With a constraint
4952 u0map = Pair[]
@@ -58,10 +61,16 @@ const M = ModelingToolkit
5861
5962 cprob = CasADiDynamicOptProblem (
6063 lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01 )
61- csol = solve (cprob , CasADiCollocation (" ipopt" , constructTsitouras5 ()))
64+ csol = solve (pprob , CasADiCollocation (" ipopt" , constructTsitouras5 ()))
6265 @test csol. sol (0.6 )[1 ] ≈ 3.5
6366 @test csol. sol (0.3 )[1 ] ≈ 7.0
6467
68+ pprob = PyomoDynamicOptProblem (
69+ lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01 )
70+ psol = solve (pprob, PyomoCollocation (" ipopt" , LagrangeLegendre (3 )))
71+ @test psol. sol (0.6 )[1 ] ≈ 3.5
72+ @test psol. sol (0.3 )[1 ] ≈ 7.0
73+
6574 iprob = InfiniteOptDynamicOptProblem (
6675 lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01 )
6776 isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer, InfiniteOpt. OrthogonalCollocation (3 ))) # 48.564 ms, 9.58 MiB
@@ -77,10 +86,14 @@ const M = ModelingToolkit
7786 isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer, InfiniteOpt. OrthogonalCollocation (3 )))
7887 @test all (u -> u > [1 , 1 ], isol. sol. u)
7988
80- jprob = JuMPDynamicOptProblem (lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01 )
89+ jprob = PyoDynamicOptProblem (lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01 )
8190 jsol = solve (jprob, JuMPCollocation (Ipopt. Optimizer, constructRadauIA3 ()))
8291 @test all (u -> u > [1 , 1 ], jsol. sol. u)
8392
93+ pprob = PyomoDynamicOptProblem (lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01 )
94+ psol = solve (pprob, PyomoCollocation (" ipopt" , MidpointEuler ()))
95+ @test all (u -> u > [1 , 1 ], psol. sol. u)
96+
8497 cprob = CasADiDynamicOptProblem (
8598 lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01 )
8699 csol = solve (cprob, CasADiCollocation (" ipopt" , constructRadauIA3 ()))
125138
126139 cprob = CasADiDynamicOptProblem (block, u0map, tspan, parammap; dt = 0.01 )
127140 csol = solve (cprob, CasADiCollocation (" ipopt" , constructVerner8 ()))
128- # Linear systems have bang-bang controls
129141 @test is_bangbang (csol. input_sol, [- 1.0 ], [1.0 ])
130- # Test reached final position.
131142 @test ≈ (csol. sol. u[end ][2 ], 0.25 , rtol = 1e-5 )
132143
133144 # Test dynamics
143154 isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
144155 @test is_bangbang (isol. input_sol, [- 1.0 ], [1.0 ])
145156 @test ≈ (isol. sol. u[end ][2 ], 0.25 , rtol = 1e-5 )
157+
158+ pprob = PyomoDynamicOptProblem (block, u0map, tspan, parammap; dt = 0.01 )
159+ psol = solve (pprob, PyomoCollocation (" ipopt" , BackwardEuler ()))
160+ @test is_bangbang (psol. input_sol, [- 1.0 ], [1.0 ])
161+ @test ≈ (psol. sol. u[end ][2 ], 0.25 , rtol = 1e-5 )
162+
146163 osol = solve (oprob, ImplicitEuler (); dt = 0.01 , adaptive = false )
147164 @test ≈ (isol. sol. u, osol. u, rtol = 0.05 )
165+ @test ≈ (psol. sol. u, osol. u, rtol = 0.05 )
148166
149167 # ##################
150168 # ## Bee example ###
172190 cprob = CasADiDynamicOptProblem (beesys, u0map, tspan, pmap; dt = 0.01 )
173191 csol = solve (cprob, CasADiCollocation (" ipopt" , constructTsitouras5 ()))
174192 @test is_bangbang (csol. input_sol, [0.0 ], [1.0 ])
193+ pprob = PyomoDynamicOptProblem (beesys, u0map, tspan, pmap, dt = 0.01 )
194+ psol = solve (pprob, PyomoCollocation (" ipopt" , BackwardEuler ()))
195+ @test is_bangbang (psol. input_sol, [0.0 ], [1.0 ])
175196
176197 @parameters (α_interp:: LinearInterpolation )(.. )
177198 eqs = [D (w (t)) ~ - μ * w (t) + b * s * α_interp (t) * w (t),
186207 @test ≈ (osol. u, csol. sol. u, rtol = 0.01 )
187208 osol2 = solve (oprob, ImplicitEuler (); dt = 0.01 , adaptive = false )
188209 @test ≈ (osol2. u, isol. sol. u, rtol = 0.01 )
210+ @test ≈ (osol2. u, psol. sol. u, rtol = 0.01 )
189211end
190212
191213@testset " Rocket launch" begin
224246 isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
225247 @test isol. sol. u[end ][1 ] > 1.012
226248
249+ pprob = PyomoCollocationDynamicOptProblem (rocket, u0map, (ts, te), pmap; dt = 0.001 , cse = false )
250+ psol = solve (pprob, PyomoCollocation (" ipopt" ))
251+ @test psol. sol. u[end ][1 ] > 1.012
252+
227253 # Test solution
228254 @parameters (T_interp:: CubicSpline )(.. )
229255 eqs = [D (h (t)) ~ v (t),
240266 oprob1 = ODEProblem (rocket_ode, merge (Dict (u0map), Dict (pmap), interpmap1), (ts, te))
241267 osol1 = solve (oprob1, ImplicitEuler (); adaptive = false , dt = 0.001 )
242268 @test ≈ (isol. sol. u, osol1. u, rtol = 0.01 )
269+
270+ interpmap2 = Dict (T_interp => ctrl_to_spline (psol. input_sol, CubicSpline))
271+ oprob2 = ODEProblem (rocket_ode, u0map, (ts, te), merge (Dict (pmap), interpmap2))
272+ osol2 = solve (oprob2, RadauIIA5 (); adaptive = false , dt = 0.001 )
273+ @test ≈ (psol. sol. u, osol2. u, rtol = 0.01 )
243274end
244275
245276@testset " Free final time problems" begin
269300 isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
270301 @test isapprox (isol. sol. t[end ], 10.0 , rtol = 1e-3 )
271302
303+ pprob = PyomoDynamicOptProblem (rocket, u0map, (0 , tf), pmap; steps = 201 )
304+ psol = solve (pprob, PyomoCollocation (" ipopt" ))
305+ @test isapprox (psol. sol. t[end ], 10.0 , rtol = 1e-3 )
306+
272307 @variables x (.. ) v (.. )
273308 @variables u (.. ) [bounds = (- 1.0 , 1.0 ), input = true ]
274309 @parameters tf
293328 iprob = InfiniteOptDynamicOptProblem (block, u0map, tspan, parammap; steps = 51 )
294329 isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
295330 @test isapprox (isol. sol. t[end ], 2.0 , atol = 1e-5 )
331+
332+ pprob = PyomoDynamicOptProblem (block, u0map, tspan, parammap; steps = 51 )
333+ psol = solve (pprob, PyomoCollocation (" ipopt" ))
334+ @test isapprox (psol. sol. t[end ], 2.0 , atol = 1e-5 )
296335end
297336
298337@testset " Cart-pole problem" begin
335374 iprob = InfiniteOptDynamicOptProblem (cartpole, u0map, tspan, pmap; dt = 0.04 )
336375 isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
337376 @test isol. sol. u[end ] ≈ [π, 0 , 0 , 0 ]
377+
378+ pprob = PyomoDynamicOptProblem (cartpole, u0map, tspan, pmap; dt = 0.04 )
379+ psol = solve (pprob, PyomoCollocation (" ipopt" , LagrangeLegendre (4 )))
380+ @test psol. sol. u[end ] ≈ [π, 0 , 0 , 0 ]
338381end
0 commit comments