Baban
(Baban)
February 14, 2018, 10:57pm
1
Hi,

I am trying to run this code:

for istep=1:length(param_range)

param = param_range(istep);
p = param; % Aliasing.

% Some arbitrary possibly non-convex param sweep.
F_param = [p 0 0
0 0 p
0 p 0];

cvx_clear
cvx_begin
variable X(3,3);
variable v(3);
expression X(3,3)
X = X0 + F_param + [0 v(2) 0
0 0 v(3)
v(1) 0 0];
minimize norm_nuc(X);
subject to
v(1) >= lower_bounds(1);
v(2) >= lower_bounds(2);
v(3) >= lower_bounds(3);
v(1) <= upper_bounds(1);
v(2) <= upper_bounds(2);
v(3) <= upper_bounds(3);

cvx_end
end

It gives me the captioned error. I am wondering what could be the mistake. Thanks a lot

You have separately declared `X`

as a variable and as an expression. Remove the declaration of X as a variable. You can also remove the declaration of X as an expression if you want.

Baban
(Baban)
March 3, 2018, 10:43pm
3
Sorry for the late follow-up. Even when I change it to something like this, the error still persists.

cvx_clear
cvx_begin
variable X(3,3);
variable v(3);

minimize norm_nuc(X);
subject to
v(1) >= lower_bounds(1);
v(2) >= lower_bounds(2);
v(3) >= lower_bounds(3);
v(1) <= upper_bounds(1);
v(2) <= upper_bounds(2);
v(3) <= upper_bounds(3);
X = X0 + F_param + [0 v(2) 0
0 0 v(3)
v(1) 0 0];

cvx_end

I wonder where am I missing out. Thanks.

You got the message because you still have `variable X(3,3);`

. Remove that line from your program. And then you need to have `X = X0 + F_param + [0 v(2) 0;0 0 v(3)l;v(1) 0 0];`

before you use X in the objective.

Also note that although the following code is correct

```
v(1) >= lower_bounds(1);
v(2) >= lower_bounds(2);
v(3) >= lower_bounds(3);
v(1) <= upper_bounds(1);
v(2) <= upper_bounds(2);
v(3) <= upper_bounds(3);
```

you could instead use
`lower_bounds <= v <= upper_bounds`

So your complete program could be

```
cvx_begin
variable v(3);
X = X0 + F_param + [0 v(2) 0;0 0 v(3);v(1) 0 0];
minimize norm_nuc(X);
subject to
lower_bounds <= v <= upper_bounds
cvx_end
```

Alternatively, you could keep the declaration of X as a variable, and change what is now an expression assignment on X into a constraint.

```
cvx_begin
variable v(3);
variable X(3,3);
minimize norm_nuc(X);
subject to
lower_bounds <= v <= upper_bounds
X == X0 + F_param + [0 v(2) 0;0 0 v(3);v(1) 0 0];
cvx_end
```

I’'m not sure, but I think CVX may present the exact same model (equally efficient) to the solver in either case.

Or you can just use the expression for X directly in the objective.

```
cvx_begin
variable v(3);
minimize(norm_nuc(X0 + F_param + [0 v(2) 0;0 0 v(3);v(1) 0 0]))
subject to
lower_bounds <= v <= upper_bounds
cvx_end
```

Baban
(Baban)
March 3, 2018, 11:49pm
5
Yeah, before I saw your reply, I’d already tried the penultimate code snippet you mentioned and it worked. Thanks a lot for your inputs!