1+ using CTDirect
2+ using CTBase
3+
4+ println (" Test: double integrator" )
5+
6+ # min tf
7+ ocp1 = Model (variable= true )
8+ state! (ocp1, 2 )
9+ control! (ocp1, 1 )
10+ variable! (ocp1, 1 )
11+ time! (ocp1, 0 , Index (1 ))
12+ constraint! (ocp1, :initial , [0 ,0 ], :initial_constraint )
13+ constraint! (ocp1, :final , [1 ,0 ], :final_constraint )
14+ constraint! (ocp1, :control , - 1 , 1 , :control_constraint )
15+ constraint! (ocp1, :variable , 0.1 , 10 , :variable_constraint )
16+ dynamics! (ocp1, (x, u, v) -> [x[2 ], u])
17+ objective! (ocp1, :mayer , (x0, xf, v) -> v)
18+ sol1 = solve (ocp1, grid_size= 100 , print_level= 0 , tol= 1e-12 )
19+ @testset verbose = true showtiming = true " :double_integrator :min_tf" begin
20+ @test sol1. objective ≈ 2.0 rtol= 1e-2
21+ end
22+
23+
24+ # min tf (lagrange)
25+ ocp2 = Model (variable= true )
26+ state! (ocp2, 2 )
27+ control! (ocp2, 1 )
28+ variable! (ocp2, 1 )
29+ time! (ocp2, 0 , Index (1 ))
30+ constraint! (ocp2, :initial , [0 ,0 ], :initial_constraint )
31+ constraint! (ocp2, :final , [1 ,0 ], :final_constraint )
32+ constraint! (ocp2, :control , - 1 , 1 , :control_constraint )
33+ constraint! (ocp2, :variable , 0.1 , 10 , :variable_constraint )
34+ dynamics! (ocp2, (x, u, v) -> [x[2 ], u])
35+ objective! (ocp2, :lagrange , (x, u, v) -> 1 )
36+ sol2 = solve (ocp2, grid_size= 100 , print_level= 0 , tol= 1e-12 )
37+ @testset verbose = true showtiming = true " :double_integrator :min_tf :lagrange" begin
38+ @test sol2. objective ≈ 2.0 rtol= 1e-2
39+ end
40+
41+
42+ # min tf (vectorial)
43+ ocp3 = Model (variable= true )
44+ state! (ocp3, 2 )
45+ control! (ocp3, 1 )
46+ variable! (ocp3, 1 )
47+ time! (ocp3, 0 , Index (1 ))
48+ constraint! (ocp3, :initial , [0 ,0 ], :initial_constraint )
49+ constraint! (ocp3, :final , [1 ,0 ], :final_constraint )
50+ constraint! (ocp3, :control , [- 1 ], [1 ], :control_constraint )
51+ constraint! (ocp3, :variable , [0.1 ], [10 ], :variable_constraint )
52+ dynamics! (ocp3, (x, u, v) -> [x[2 ], u[1 ]])
53+ objective! (ocp3, :mayer , (x0, xf, v) -> v[1 ])
54+ sol3 = solve (ocp1, grid_size= 100 , print_level= 0 , tol= 1e-12 )
55+ @testset verbose = true showtiming = true " :double_integrator :min_tf :vectorial" begin
56+ @test sol3. objective ≈ 2.0 rtol= 1e-2
57+ end
58+
59+
60+ # max t0 (free t0 and tf)
61+ ocp4 = Model (variable= true )
62+ state! (ocp4, 2 )
63+ control! (ocp4, 1 )
64+ variable! (ocp4, 2 )
65+ time! (ocp4, Index (1 ), Index (2 ))
66+ constraint! (ocp4, :initial , [0 ,0 ], :initial_constraint )
67+ constraint! (ocp4, :final , [1 ,0 ], :final_constraint )
68+ constraint! (ocp4, :control , - 1 , 1 , :control_constraint )
69+ constraint! (ocp4, :variable , [0.1 , 0.1 ], [10 , 10 ], :variable_constraint )
70+ dynamics! (ocp4, (x, u, v) -> [x[2 ], u])
71+ objective! (ocp4, :mayer , (x0, xf, v) -> v[1 ], :max )
72+ sol4 = solve (ocp4, grid_size= 100 , print_level= 0 , tol= 1e-12 )
73+ @testset verbose = true showtiming = true " :double_integrator :max_t0" begin
74+ @test sol4. objective ≈ 8.0 rtol= 1e-2
75+ end
76+
77+
78+ # min tf, abstract definition
79+ @def ocp begin
80+ tf ∈ R, variable
81+ t ∈ [ 0 , tf ], time
82+ x ∈ R², state
83+ u ∈ R, control
84+ - 1 ≤ u (t) ≤ 1
85+ x (0 ) == [ 0 , 0 ]
86+ x (tf) == [ 1 , 0 ]
87+ 0.1 ≤ tf ≤ Inf
88+ ẋ (t) == [ x₂ (t), u (t) ]
89+ tf → min
90+ end
91+ sol = solve (ocp, grid_size= 100 , print_level= 0 , tol= 1e-12 )
92+ @testset verbose = true showtiming = true " :double_integrator :min_tf :abstract" begin
93+ @test sol. objective ≈ 2.0 rtol= 1e-2
94+ end
95+
96+
97+ # min energy dual control
98+ ocp5 = Model ()
99+ state! (ocp5, 2 )
100+ control! (ocp5, 2 )
101+ time! (ocp5, 0 , 5 )
102+ constraint! (ocp5, :initial , [0 ,0 ], :initial_constraint )
103+ constraint! (ocp5, :final , [1 ,0 ], :final_constraint )
104+ constraint! (ocp5, :control , 1 : 2 , [0 ,0 ], [1 ,1 ], :control_box ) # [u_, u+]
105+ dynamics! (ocp5, (x, u) -> [x[2 ], - u[1 ] + u[2 ]])
106+ objective! (ocp5, :lagrange , (x, u) -> u[1 ]* u[1 ] + u[2 ]* u[2 ])
107+ sol5 = solve (ocp5, grid_size= 50 , print_level= 0 , tol= 1e-12 )
108+ @testset verbose = true showtiming = true " :double_integrator :min_energy" begin
109+ @test sol5. objective ≈ 9.6e-2 rtol= 1e-2
110+ end
0 commit comments