@@ -44,6 +44,9 @@ const M = ModelingToolkit
44
44
@test ≈ (isol. sol. u, osol2. u, rtol = 0.001 )
45
45
csol2 = solve (cprob, CasADiCollocation (" ipopt" , constructImplicitEuler ()))
46
46
@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
47
50
48
51
# With a constraint
49
52
u0map = Pair[]
@@ -62,6 +65,12 @@ const M = ModelingToolkit
62
65
@test csol. sol (0.6 ; idxs = x (t)) ≈ 3.5
63
66
@test csol. sol (0.3 ; idxs = x (t)) ≈ 7.0
64
67
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
+
65
74
iprob = InfiniteOptDynamicOptProblem (
66
75
lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01 )
67
76
isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer, InfiniteOpt. OrthogonalCollocation (3 ))) # 48.564 ms, 9.58 MiB
@@ -77,10 +86,14 @@ const M = ModelingToolkit
77
86
isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer, InfiniteOpt. OrthogonalCollocation (3 )))
78
87
@test all (u -> u > [1 , 1 ], isol. sol. u)
79
88
80
- jprob = JuMPDynamicOptProblem (lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01 )
89
+ jprob = PyoDynamicOptProblem (lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01 )
81
90
jsol = solve (jprob, JuMPCollocation (Ipopt. Optimizer, constructRadauIA3 ()))
82
91
@test all (u -> u > [1 , 1 ], jsol. sol. u)
83
92
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
+
84
97
cprob = CasADiDynamicOptProblem (
85
98
lksys, u0map, tspan, parammap; guesses = guess, dt = 0.01 )
86
99
csol = solve (cprob, CasADiCollocation (" ipopt" , constructRadauIA3 ()))
125
138
126
139
cprob = CasADiDynamicOptProblem (block, u0map, tspan, parammap; dt = 0.01 )
127
140
csol = solve (cprob, CasADiCollocation (" ipopt" , constructVerner8 ()))
128
- # Linear systems have bang-bang controls
129
141
@test is_bangbang (csol. input_sol, [- 1.0 ], [1.0 ])
130
142
# Test reached final position.
131
143
@test ≈ (csol. sol[x (t)][end ], 0.25 , rtol = 1e-5 )
143
155
isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
144
156
@test is_bangbang (isol. input_sol, [- 1.0 ], [1.0 ])
145
157
@test ≈ (isol. sol[x (t)][end ], 0.25 , rtol = 1e-5 )
158
+
159
+ pprob = PyomoDynamicOptProblem (block, u0map, tspan, parammap; dt = 0.01 )
160
+ psol = solve (pprob, PyomoCollocation (" ipopt" , BackwardEuler ()))
161
+ @test is_bangbang (psol. input_sol, [- 1.0 ], [1.0 ])
162
+ @test ≈ (psol. sol. u[end ][2 ], 0.25 , rtol = 1e-5 )
163
+
146
164
osol = solve (oprob, ImplicitEuler (); dt = 0.01 , adaptive = false )
147
165
@test ≈ (isol. sol. u, osol. u, rtol = 0.05 )
166
+ @test ≈ (psol. sol. u, osol. u, rtol = 0.05 )
148
167
149
168
# ##################
150
169
# ## Bee example ###
172
191
cprob = CasADiDynamicOptProblem (beesys, u0map, tspan, pmap; dt = 0.01 )
173
192
csol = solve (cprob, CasADiCollocation (" ipopt" , constructTsitouras5 ()))
174
193
@test is_bangbang (csol. input_sol, [0.0 ], [1.0 ])
194
+ pprob = PyomoDynamicOptProblem (beesys, u0map, tspan, pmap, dt = 0.01 )
195
+ psol = solve (pprob, PyomoCollocation (" ipopt" , BackwardEuler ()))
196
+ @test is_bangbang (psol. input_sol, [0.0 ], [1.0 ])
175
197
176
198
@parameters (α_interp:: LinearInterpolation )(.. )
177
199
eqs = [D (w (t)) ~ - μ * w (t) + b * s * α_interp (t) * w (t),
186
208
@test ≈ (osol. u, csol. sol. u, rtol = 0.01 )
187
209
osol2 = solve (oprob, ImplicitEuler (); dt = 0.01 , adaptive = false )
188
210
@test ≈ (osol2. u, isol. sol. u, rtol = 0.01 )
211
+ @test ≈ (osol2. u, psol. sol. u, rtol = 0.01 )
189
212
end
190
213
191
214
@testset " Rocket launch" begin
224
247
isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
225
248
@test isol. sol[h (t)][end ] > 1.012
226
249
250
+ pprob = PyomoCollocationDynamicOptProblem (rocket, u0map, (ts, te), pmap; dt = 0.001 , cse = false )
251
+ psol = solve (pprob, PyomoCollocation (" ipopt" ))
252
+ @test psol. sol. u[end ][1 ] > 1.012
253
+
227
254
# Test solution
228
255
@parameters (T_interp:: CubicSpline )(.. )
229
256
eqs = [D (h (t)) ~ v (t),
240
267
oprob1 = ODEProblem (rocket_ode, merge (Dict (u0map), Dict (pmap), interpmap1), (ts, te))
241
268
osol1 = solve (oprob1, ImplicitEuler (); adaptive = false , dt = 0.001 )
242
269
@test ≈ (isol. sol. u, osol1. u, rtol = 0.01 )
270
+
271
+ interpmap2 = Dict (T_interp => ctrl_to_spline (psol. input_sol, CubicSpline))
272
+ oprob2 = ODEProblem (rocket_ode, u0map, (ts, te), merge (Dict (pmap), interpmap2))
273
+ osol2 = solve (oprob2, RadauIIA5 (); adaptive = false , dt = 0.001 )
274
+ @test ≈ (psol. sol. u, osol2. u, rtol = 0.01 )
243
275
end
244
276
245
277
@testset " Free final time problems" begin
269
301
isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
270
302
@test isapprox (isol. sol. t[end ], 10.0 , rtol = 1e-3 )
271
303
304
+ pprob = PyomoDynamicOptProblem (rocket, u0map, (0 , tf), pmap; steps = 201 )
305
+ psol = solve (pprob, PyomoCollocation (" ipopt" ))
306
+ @test isapprox (psol. sol. t[end ], 10.0 , rtol = 1e-3 )
307
+
272
308
@variables x (.. ) v (.. )
273
309
@variables u (.. ) [bounds = (- 1.0 , 1.0 ), input = true ]
274
310
@parameters tf
293
329
iprob = InfiniteOptDynamicOptProblem (block, u0map, tspan, parammap; steps = 51 )
294
330
isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
295
331
@test isapprox (isol. sol. t[end ], 2.0 , atol = 1e-5 )
332
+
333
+ pprob = PyomoDynamicOptProblem (block, u0map, tspan, parammap; steps = 51 )
334
+ psol = solve (pprob, PyomoCollocation (" ipopt" ))
335
+ @test isapprox (psol. sol. t[end ], 2.0 , atol = 1e-5 )
296
336
end
297
337
298
338
@testset " Cart-pole problem" begin
335
375
iprob = InfiniteOptDynamicOptProblem (cartpole, u0map, tspan, pmap; dt = 0.04 )
336
376
isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
337
377
@test isol. sol. u[end ] ≈ [π, 0 , 0 , 0 ]
378
+
379
+ pprob = PyomoDynamicOptProblem (cartpole, u0map, tspan, pmap; dt = 0.04 )
380
+ psol = solve (pprob, PyomoCollocation (" ipopt" , LagrangeLegendre (4 )))
381
+ @test psol. sol. u[end ] ≈ [π, 0 , 0 , 0 ]
338
382
end
0 commit comments