Skip to content

Commit 39d1dc8

Browse files
local test suite (#45)
1 parent ad09750 commit 39d1dc8

File tree

3 files changed

+170
-1
lines changed

3 files changed

+170
-1
lines changed

src/utils.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ function initial_guess(ctd)
140140

141141
# set variables
142142
if (ctd.variable_dimension > 0)
143-
v_init = zeros(ctd.control_variable)
143+
v_init = zeros(ctd.variable_dimension)
144144
v_init[1:ctd.variable_dimension] = init[ctd.state_dimension+ctd.control_dimension+1:ctd.state_dimension+ctd.control_dimension+ctd.variable_dimension]
145145
set_variable!(xu0, v_init, ctd)
146146
end

test/suite/double_integrator.jl

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
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
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using CTDirect
2+
using CTBase
3+
4+
println("Test: goddard all constraints")
5+
6+
# goddard max final altitue (all constraint types formulation)
7+
ocp = Model(variable=true)
8+
Cd = 310
9+
Tmax = 3.5
10+
β = 500
11+
b = 2
12+
r0 = 1
13+
v0 = 0
14+
vmax = 0.1
15+
m0 = 1
16+
mf = 0.6
17+
x0 = [ r0, v0, m0 ]
18+
state!(ocp, 3)
19+
control!(ocp, 1)
20+
variable!(ocp, 1)
21+
time!(ocp, 0, Index(1))
22+
# use all possible types of constraints
23+
# initial condition
24+
constraint!(ocp, :initial, x0, :initial_constraint)
25+
# final condition
26+
constraint!(ocp, :final, Index(3), mf, :final_constraint)
27+
# state constraint
28+
constraint!(ocp, :state, (x,v)->x[2], -Inf, vmax, :state_con_v_ub)
29+
# control constraint
30+
constraint!(ocp, :control, (u,v)->u, -Inf, 1, :control_con_u_ub)
31+
# mixed constraint
32+
constraint!(ocp, :mixed, (x,u,v)->x[3], mf, Inf, :mixed_con_m_lb)
33+
# variable constraint
34+
constraint!(ocp, :variable, v->v, -Inf, 10, :variable_con_tf_ubx)
35+
# state box
36+
constraint!(ocp, :state, 1:2, [r0,v0], [r0+0.2, Inf], :state_box_rv)
37+
#constraint!(ocp, :state, Index(2), v0, Inf, :state_box_vmin)
38+
# control box
39+
constraint!(ocp, :control, Index(1), 0, Inf, :control_box_lb)
40+
# variable box
41+
constraint!(ocp, :variable, Index(1), 0.01, Inf, :variable_box_tfmin)
42+
objective!(ocp, :mayer, (x0, xf, v) -> xf[1], :max)
43+
function F0(x)
44+
r, v, m = x
45+
D = Cd * v^2 * exp(-β*(r - 1))
46+
return [ v, -D/m - 1/r^2, 0 ]
47+
end
48+
function F1(x)
49+
r, v, m = x
50+
return [ 0, Tmax/m, -b*Tmax ]
51+
end
52+
dynamics!(ocp, (x, u, v) -> F0(x) + u*F1(x) )
53+
init_constant = [1.05, 0.1, 0.8, 0.5, 0.1]
54+
sol = solve(ocp, grid_size=30, print_level=0, tol=1e-8, init=init_constant)
55+
#println(sol.objective)
56+
#plot(sol)
57+
@testset verbose = true showtiming = true ":goddard :max_rf :all_constraints_types" begin
58+
@test sol.objective 1.0125 rtol=1e-2
59+
end

0 commit comments

Comments
 (0)