|
77 | 77 | function get_final_time(xu, ctd) |
78 | 78 | if ctd.has_free_final_time |
79 | 79 | v = get_variable(xu, ctd) |
80 | | - #println("v: ",v) |
81 | | - #println("ctd.final_time: ",ctd.final_time) |
82 | | - #println("v[ctd.final_time]: ", v[ctd.final_time]) |
83 | 80 | return v[ctd.final_time] |
84 | 81 | else |
85 | 82 | return ctd.final_time |
86 | 83 | end |
87 | 84 | end |
88 | 85 |
|
| 86 | +#= |
| 87 | +function get_time_step(xu, ctd, i) |
| 88 | + N = ctd.dim_NLP_steps |
| 89 | + @assert i <= N "trying to get time step for i > N" |
| 90 | + t0 = get_initial_time(xu, ctd) |
| 91 | + tf = get_final_time(xu, ctd) |
| 92 | + return t0 + i * (tf - t0) / N |
| 93 | +end |
| 94 | +=# |
89 | 95 |
|
90 | 96 | ## Initialization for the NLP problem |
91 | 97 |
|
92 | 98 | function set_state_at_time_step!(xu, x_init, ctd, i) |
93 | 99 | nx = ctd.dim_NLP_state |
| 100 | + n = ctd.state_dimension |
94 | 101 | N = ctd.dim_NLP_steps |
95 | 102 | @assert i <= N "trying to set init for x(t_i) with i > N" |
96 | | - xu[1+i*nx:(i+1)*nx] = x_init[1:nx] |
| 103 | + # NB. only set first n components of state variable (nx = n+1 for lagrange cost) |
| 104 | + if n == 1 |
| 105 | + xu[i*nx + 1] = x_init[] |
| 106 | + else |
| 107 | + xu[i*nx + 1 : i*nx + n] = x_init |
| 108 | + end |
97 | 109 | end |
98 | 110 |
|
99 | 111 | function set_control_at_time_step!(xu, u_init, ctd, i) |
100 | 112 | nx = ctd.dim_NLP_state |
101 | 113 | m = ctd.control_dimension |
102 | 114 | N = ctd.dim_NLP_steps |
103 | 115 | @assert i <= N "trying to set init for u(t_i) with i > N" |
104 | | - xu[1+(N+1)*nx+i*m:m+(N+1)*nx+i*m] = u_init[1:m] |
| 116 | + offset = (N+1)*nx |
| 117 | + if m == 1 |
| 118 | + xu[offset + i*m + 1] = u_init[] |
| 119 | + else |
| 120 | + xu[offset + i*m + 1 : offset + i*m + m] = u_init |
| 121 | + end |
105 | 122 | end |
106 | 123 |
|
107 | 124 | function set_variable!(xu, v_init, ctd) |
108 | | - xu[end-ctd.variable_dimension+1:end] = v_init[1:ctd.variable_dimension] |
| 125 | + if ctd.variable_dimension == 1 |
| 126 | + xu[end] = v_init[] |
| 127 | + else |
| 128 | + xu[end-ctd.variable_dimension+1 : end] = v_init |
| 129 | + end |
109 | 130 | end |
110 | 131 |
|
111 | 132 | function initial_guess(ctd) |
112 | 133 |
|
113 | | - N = ctd.dim_NLP_steps |
114 | | - init = ctd.NLP_init |
| 134 | + # default initialization |
| 135 | + # note: internal variables (lagrange cost, k_i for RK schemes) will keep these default values |
| 136 | + xu0 = 0.1 * ones(ctd.dim_NLP_variables) |
115 | 137 |
|
116 | | - if init === nothing |
117 | | - # default initialization |
118 | | - xu0 = 0.1*ones(ctd.dim_NLP_variables) |
119 | | - else |
120 | | - # split state / control init values |
121 | | - if length(init) != (ctd.state_dimension + ctd.control_dimension + ctd.variable_dimension) |
122 | | - error("vector for initialization should be of size dim_x + dim_u + dim_v ie:",ctd.state_dimension+ctd.control_dimension+ctd.variable_dimension) |
123 | | - end |
124 | | - x_init = zeros(ctd.dim_NLP_state) |
125 | | - x_init[1:ctd.state_dimension] = init[1:ctd.state_dimension] |
126 | | - u_init = zeros(ctd.control_dimension) |
127 | | - u_init[1:ctd.control_dimension] = init[ctd.state_dimension+1:ctd.state_dimension+ctd.control_dimension] |
128 | | - |
129 | | - # mayer -> lagrange additional state |
130 | | - if ctd.has_lagrange_cost |
131 | | - x_init[ctd.dim_NLP_state] = 0.1 |
132 | | - end |
| 138 | + init = ctd.NLP_init |
| 139 | + if init.info != :undefined |
| 140 | + N = ctd.dim_NLP_steps |
| 141 | + t0 = get_initial_time(xu0, ctd) |
| 142 | + tf = get_final_time(xu0, ctd) |
| 143 | + h = (tf - t0) / N |
133 | 144 |
|
134 | | - # set constant initialization for state / control variables |
135 | | - xu0 = zeros(ctd.dim_NLP_variables) |
| 145 | + # set state / control variables |
136 | 146 | for i in 0:N |
137 | | - set_state_at_time_step!(xu0, x_init, ctd, i) |
138 | | - set_control_at_time_step!(xu0, u_init, ctd, i) |
| 147 | + ti = t0 + i * h |
| 148 | + set_state_at_time_step!(xu0, init.state_init(ti), ctd, i) |
| 149 | + set_control_at_time_step!(xu0, init.control_init(ti), ctd, i) |
139 | 150 | end |
140 | 151 |
|
141 | 152 | # set variables |
142 | 153 | if (ctd.variable_dimension > 0) |
143 | | - v_init = zeros(ctd.variable_dimension) |
144 | | - v_init[1:ctd.variable_dimension] = init[ctd.state_dimension+ctd.control_dimension+1:ctd.state_dimension+ctd.control_dimension+ctd.variable_dimension] |
145 | | - set_variable!(xu0, v_init, ctd) |
| 154 | + set_variable!(xu0, init.variable_init, ctd) |
146 | 155 | end |
147 | 156 | end |
148 | 157 |
|
|
0 commit comments