@@ -11,6 +11,8 @@ using Pyomo
11
11
import DiffEqBase: solve
12
12
const M = ModelingToolkit
13
13
14
+ const ENABLE_CASADI = VERSION >= v " 1.11"
15
+
14
16
@testset " ODE Solution, no cost" begin
15
17
# Test solving without anything attached.
16
18
@parameters α= 1.5 β= 1.0 γ= 3.0 δ= 1.0
@@ -31,10 +33,13 @@ const M = ModelingToolkit
31
33
jsol = solve (jprob, JuMPCollocation (Ipopt. Optimizer, constructRK4 ()))
32
34
oprob = ODEProblem (sys, [u0map; parammap], tspan)
33
35
osol = solve (oprob, SimpleRK4 (), dt = 0.01 )
34
- cprob = CasADiDynamicOptProblem (sys, [u0map; parammap], tspan, dt = 0.01 )
35
- csol = solve (cprob, CasADiCollocation (" ipopt" , constructRK4 ()))
36
+
36
37
@test jsol. sol. u ≈ osol. u
37
- @test csol. sol. u ≈ osol. u
38
+ if ENABLE_CASADI
39
+ cprob = CasADiDynamicOptProblem (sys, [u0map; parammap], tspan, dt = 0.01 )
40
+ csol = solve (cprob, CasADiCollocation (" ipopt" , constructRK4 ()))
41
+ @test csol. sol. u ≈ osol. u
42
+ end
38
43
39
44
# Implicit method.
40
45
osol2 = solve (oprob, ImplicitEuler (), dt = 0.01 , adaptive = false )
@@ -43,8 +48,10 @@ const M = ModelingToolkit
43
48
iprob = InfiniteOptDynamicOptProblem (sys, [u0map; parammap], tspan, dt = 0.01 )
44
49
isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
45
50
@test ≈ (isol. sol. u, osol2. u, rtol = 0.001 )
46
- csol2 = solve (cprob, CasADiCollocation (" ipopt" , constructImplicitEuler ()))
47
- @test ≈ (csol2. sol. u, osol2. u, rtol = 0.001 )
51
+ if ENABLE_CASADI
52
+ csol2 = solve (cprob, CasADiCollocation (" ipopt" , constructImplicitEuler ()))
53
+ @test ≈ (csol2. sol. u, osol2. u, rtol = 0.001 )
54
+ end
48
55
pprob = PyomoDynamicOptProblem (sys, [u0map; parammap], tspan, dt = 0.01 )
49
56
psol = solve (pprob, PyomoCollocation (" ipopt" , BackwardEuler ()))
50
57
@test all ([≈ (psol. sol (t), osol2 (t), rtol = 1e-2 ) for t in 0.0 : 0.01 : 1.0 ])
@@ -61,11 +68,13 @@ const M = ModelingToolkit
61
68
@test jsol. sol (0.6 ; idxs = x (t)) ≈ 3.5
62
69
@test jsol. sol (0.3 ; idxs = x (t)) ≈ 7.0
63
70
64
- cprob = CasADiDynamicOptProblem (
65
- lksys, [u0map; parammap], tspan; guesses = guess, dt = 0.01 )
66
- csol = solve (cprob, CasADiCollocation (" ipopt" , constructTsitouras5 ()))
67
- @test csol. sol (0.6 ; idxs = x (t)) ≈ 3.5
68
- @test csol. sol (0.3 ; idxs = x (t)) ≈ 7.0
71
+ if ENABLE_CASADI
72
+ cprob = CasADiDynamicOptProblem (
73
+ lksys, [u0map; parammap], tspan; guesses = guess, dt = 0.01 )
74
+ csol = solve (cprob, CasADiCollocation (" ipopt" , constructTsitouras5 ()))
75
+ @test csol. sol (0.6 ; idxs = x (t)) ≈ 3.5
76
+ @test csol. sol (0.3 ; idxs = x (t)) ≈ 7.0
77
+ end
69
78
70
79
pprob = PyomoDynamicOptProblem (
71
80
lksys, [u0map; parammap], tspan; guesses = guess, dt = 0.01 )
@@ -100,10 +109,12 @@ const M = ModelingToolkit
100
109
psol = solve (pprob, PyomoCollocation (" ipopt" , MidpointEuler ()))
101
110
@test all (u -> u > [1 , 1 ], psol. sol. u)
102
111
103
- cprob = CasADiDynamicOptProblem (
104
- lksys, [u0map; parammap], tspan; guesses = guess, dt = 0.01 )
105
- csol = solve (cprob, CasADiCollocation (" ipopt" , constructRadauIA3 ()))
106
- @test all (u -> u > [1 , 1 ], csol. sol. u)
112
+ if ENABLE_CASADI
113
+ cprob = CasADiDynamicOptProblem (
114
+ lksys, [u0map; parammap], tspan; guesses = guess, dt = 0.01 )
115
+ csol = solve (cprob, CasADiCollocation (" ipopt" , constructRadauIA3 ()))
116
+ @test all (u -> u > [1 , 1 ], csol. sol. u)
117
+ end
107
118
end
108
119
109
120
function is_bangbang (input_sol, lbounds, ubounds, rtol = 1e-4 )
@@ -143,11 +154,13 @@ end
143
154
# Test reached final position.
144
155
@test ≈ (jsol. sol[x (t)][end ], 0.25 , rtol = 1e-5 )
145
156
146
- cprob = CasADiDynamicOptProblem (block, [u0map; parammap], tspan; dt = 0.01 )
147
- csol = solve (cprob, CasADiCollocation (" ipopt" , constructVerner8 ()))
148
- @test is_bangbang (csol. input_sol, [- 1.0 ], [1.0 ])
149
- # Test reached final position.
150
- @test ≈ (csol. sol[x (t)][end ], 0.25 , rtol = 1e-5 )
157
+ if ENABLE_CASADI
158
+ cprob = CasADiDynamicOptProblem (block, [u0map; parammap], tspan; dt = 0.01 )
159
+ csol = solve (cprob, CasADiCollocation (" ipopt" , constructVerner8 ()))
160
+ @test is_bangbang (csol. input_sol, [- 1.0 ], [1.0 ])
161
+ # Test reached final position.
162
+ @test ≈ (csol. sol[x (t)][end ], 0.25 , rtol = 1e-5 )
163
+ end
151
164
152
165
# Test dynamics
153
166
@parameters (u_interp:: ConstantInterpolation )(.. )
156
169
oprob = ODEProblem (block_ode, [u0map; [u_interp => spline]], tspan)
157
170
osol = solve (oprob, Vern8 (), dt = 0.01 , adaptive = false )
158
171
@test ≈ (jsol. sol. u, osol. u, rtol = 0.05 )
159
- @test ≈ (csol. sol. u, osol. u, rtol = 0.05 )
172
+ if ENABLE_CASADI
173
+ @test ≈ (csol. sol. u, osol. u, rtol = 0.05 )
174
+ end
160
175
161
176
iprob = InfiniteOptDynamicOptProblem (block, [u0map; parammap], tspan; dt = 0.01 )
162
177
isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
196
211
iprob = InfiniteOptDynamicOptProblem (beesys, [u0map; pmap], tspan, dt = 0.01 )
197
212
isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
198
213
@test is_bangbang (isol. input_sol, [0.0 ], [1.0 ])
199
- cprob = CasADiDynamicOptProblem (beesys, [u0map; pmap], tspan; dt = 0.01 )
200
- csol = solve (cprob, CasADiCollocation (" ipopt" , constructTsitouras5 ()))
201
- @test is_bangbang (csol. input_sol, [0.0 ], [1.0 ])
214
+ if ENABLE_CASADI
215
+ cprob = CasADiDynamicOptProblem (beesys, [u0map; pmap], tspan; dt = 0.01 )
216
+ csol = solve (cprob, CasADiCollocation (" ipopt" , constructTsitouras5 ()))
217
+ @test is_bangbang (csol. input_sol, [0.0 ], [1.0 ])
218
+ end
202
219
pprob = PyomoDynamicOptProblem (beesys, [u0map; pmap], tspan, dt = 0.01 )
203
220
psol = solve (pprob, PyomoCollocation (" ipopt" , BackwardEuler ()))
204
221
@test is_bangbang (psol. input_sol, [0.0 ], [1.0 ])
213
230
tspan)
214
231
osol = solve (oprob, Tsit5 (); dt = 0.01 , adaptive = false )
215
232
@test ≈ (osol. u, jsol. sol. u, rtol = 0.01 )
216
- @test ≈ (osol. u, csol. sol. u, rtol = 0.01 )
233
+ if ENABLE_CASADI
234
+ @test ≈ (osol. u, csol. sol. u, rtol = 0.01 )
235
+ end
217
236
osol2 = solve (oprob, ImplicitEuler (); dt = 0.01 , adaptive = false )
218
237
@test ≈ (osol2. u, isol. sol. u, rtol = 0.01 )
219
238
@test all ([≈ (psol. sol (t), osol2 (t), rtol = 0.01 ) for t in 0.0 : 0.01 : 4.0 ])
@@ -246,10 +265,12 @@ end
246
265
jsol = solve (jprob, JuMPCollocation (Ipopt. Optimizer, constructRadauIIA5 ()))
247
266
@test jsol. sol[h (t)][end ] > 1.012
248
267
249
- cprob = CasADiDynamicOptProblem (
250
- rocket, [u0map; pmap], (ts, te); dt = 0.001 , cse = false )
251
- csol = solve (cprob, CasADiCollocation (" ipopt" ))
252
- @test csol. sol[h (t)][end ] > 1.012
268
+ if ENABLE_CASADI
269
+ cprob = CasADiDynamicOptProblem (
270
+ rocket, [u0map; pmap], (ts, te); dt = 0.001 , cse = false )
271
+ csol = solve (cprob, CasADiCollocation (" ipopt" ))
272
+ @test csol. sol[h (t)][end ] > 1.012
273
+ end
253
274
254
275
iprob = InfiniteOptDynamicOptProblem (rocket, [u0map; pmap], (ts, te); dt = 0.001 )
255
276
isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
269
290
oprob = ODEProblem (rocket_ode, merge (Dict (u0map), Dict (pmap), interpmap), (ts, te))
270
291
osol = solve (oprob, RadauIIA5 (); adaptive = false , dt = 0.001 )
271
292
@test ≈ (jsol. sol. u, osol. u, rtol = 0.02 )
272
- @test ≈ (csol. sol. u, osol. u, rtol = 0.02 )
293
+ if ENABLE_CASADI
294
+ @test ≈ (csol. sol. u, osol. u, rtol = 0.02 )
295
+ end
273
296
274
297
interpmap1 = Dict (T_interp => ctrl_to_spline (isol. input_sol, CubicSpline))
275
298
oprob1 = ODEProblem (rocket_ode, merge (Dict (u0map), Dict (pmap), interpmap1), (ts, te))
@@ -302,10 +325,12 @@ end
302
325
@test isapprox (jsol. sol. t[end ], 10.0 , rtol = 1e-3 )
303
326
@test ≈ (M. objective_value (jsol), - 92.75 , atol = 0.25 )
304
327
305
- cprob = CasADiDynamicOptProblem (rocket, [u0map; pmap], (0 , tf); steps = 201 )
306
- csol = solve (cprob, CasADiCollocation (" ipopt" , constructTsitouras5 ()))
307
- @test isapprox (csol. sol. t[end ], 10.0 , rtol = 1e-3 )
308
- @test ≈ (M. objective_value (csol), - 92.75 , atol = 0.25 )
328
+ if ENABLE_CASADI
329
+ cprob = CasADiDynamicOptProblem (rocket, [u0map; pmap], (0 , tf); steps = 201 )
330
+ csol = solve (cprob, CasADiCollocation (" ipopt" , constructTsitouras5 ()))
331
+ @test isapprox (csol. sol. t[end ], 10.0 , rtol = 1e-3 )
332
+ @test ≈ (M. objective_value (csol), - 92.75 , atol = 0.25 )
333
+ end
309
334
310
335
iprob = InfiniteOptDynamicOptProblem (rocket, [u0map; pmap], (0 , tf); steps = 200 )
311
336
isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer))
334
359
jsol = solve (jprob, JuMPCollocation (Ipopt. Optimizer, constructVerner8 ()))
335
360
@test isapprox (jsol. sol. t[end ], 2.0 , atol = 1e-5 )
336
361
337
- cprob = CasADiDynamicOptProblem (block, [u0map; parammap], (0 , tf); steps = 51 )
338
- csol = solve (cprob, CasADiCollocation (" ipopt" , constructVerner8 ()))
339
- @test isapprox (csol. sol. t[end ], 2.0 , atol = 1e-5 )
362
+ if ENABLE_CASADI
363
+ cprob = CasADiDynamicOptProblem (block, [u0map; parammap], (0 , tf); steps = 51 )
364
+ csol = solve (cprob, CasADiCollocation (" ipopt" , constructVerner8 ()))
365
+ @test isapprox (csol. sol. t[end ], 2.0 , atol = 1e-5 )
366
+ end
340
367
341
368
iprob = InfiniteOptDynamicOptProblem (block, [u0map; parammap], tspan; steps = 51 )
342
369
isol = solve (iprob, InfiniteOptCollocation (Ipopt. Optimizer), verbose = true )
380
407
jsol = solve (jprob, JuMPCollocation (Ipopt. Optimizer, constructRK4 ()))
381
408
@test jsol. sol. u[end ] ≈ [π, 0 , 0 , 0 ]
382
409
383
- cprob = CasADiDynamicOptProblem (cartpole, [u0map; pmap], tspan; dt = 0.04 )
384
- csol = solve (cprob, CasADiCollocation (" ipopt" , constructRK4 ()))
385
- @test csol. sol. u[end ] ≈ [π, 0 , 0 , 0 ]
410
+ if ENABLE_CASADI
411
+ cprob = CasADiDynamicOptProblem (cartpole, [u0map; pmap], tspan; dt = 0.04 )
412
+ csol = solve (cprob, CasADiCollocation (" ipopt" , constructRK4 ()))
413
+ @test csol. sol. u[end ] ≈ [π, 0 , 0 , 0 ]
414
+ end
386
415
387
416
iprob = InfiniteOptDynamicOptProblem (cartpole, [u0map; pmap], tspan; dt = 0.04 )
388
417
isol = solve (iprob,
0 commit comments