Hello, folks
I’m trying to use CVX to solve an linear optimization problem. My problem has intertemporal constraints, i.e, a decision taken at time step (or iteration) i
affects the problem at time step i+1
.
For that, my idea was to solve an optimization as many times as I need using a for loop
. This means I coded something like
for i = 1:20
cvx_begin
variables x
# Here's some code
if i > 1
x - xpast <= 10;
xpast - x <= 10;
end
cvx_end
xpast = x;
end
Right after cvx_end
, I’d save the variables I needed for the next iteration as xpast
and then, when i > 1
, I’d use xpast
to ensure I explicitly have the intertemporal constriants.
This seems logical to me: At iteration i = 1
, CVX solves the problem, i.e., defines x
, and save its value to xpast
. At i = 2
, the if
condition will be checked and xpast
will be used. At this point, because xpast
is saved after cvx_end
, I know it’s just “any other” Matlab variable.
I am not sure this is correct, though. I have tried to create a reproducible example (at the end of this post) that display the issue I’m facing, but I failed. In the simpler reproducible example, the status of each optimization problem is Solved
. When I run my actual problem, I run into problems and get the following error message:
Error using +
Disciplined convex programming error:
Illegal operation: {real affine} - {invalid}
Error in - (line 21)
z = plus( x, y, true, cheat );
Error in problem1_multi_interval_final_project (line 131)
# Here's the line where I have x - xpast <= [number]
At this point, I feel like asking: Is there any problem in embedding the entire body of a CVX problem inside of a for loop
? Before I made the last round of alterations in my code, I didn’t have the Illegal operation
issue, but the statuses of my problems showed that in iterations 2 and 3, the status was Inaccurate/Solved
, and in iteration 4 the status was Infeasible
.
If you see any obvious error (I’m not experienced in Matlab or CVX) and/or any thing that just seems weird to you, please let me know. Thank you for your help.
Here’s the reproducible example that (sadly) does not reproduce the problem I’m dealing with, but shows the way I structured my problem.
problem_status = strings(3,1);
stored_x = zeros(3,1);
stored_x_past = zeros(2,1);
for i = 1:3
cvx_begin quiet
% Primal and dual variables -----------------------------------------------
variables x
% -------------------------------------------------------------------------
% Objective function
% -------------------------------------------------------------------------
minimize x
% -------------------------------------------------------------------------
% Constraints
% -------------------------------------------------------------------------
subject to
x >= 5;
if i > 1
x - x_past <= 2;
x_past - x <= 2;
end
cvx_end
x_past = x;
problem_status(i) = cvx_status;
stored_x(i) = x;
if i > 2
stored_x(i) = x_past;
end
end
Note that
>> problem_status
problem_status =
3×1 string array
"Solved"
"Solved"
"Solved"
and
>> stored_x
stored_x =
5.0000
5.0000
5.0000
and
>> stored_x_past
stored_x_past =
0
5.0000
5.0000