NaN in model

Sometimes you might see error messages from YALMIP screaming about NaNs (not a number)

You have NaNs in your constraints!. Please fix model

Alternatively, you have solved a problem, and when evaluating something, such as the objective function, you see NaNs

>> value(objective)

ans =

   NaN

In another scenario, you have constructed a variable, and it turns out to involve NaN

>> x

ans =

   0 NaN

The culprit for these are typically one out of four standard situations.

Assigning sdpvar object to a double

A common case is that a user defined a double, and then tries to insert an sdpvar object at some location using indexing

sdpvar x
y = zeros(1,5);
y(5) = x
y =

   NaN     0     0     0     0

Obviously not creating the vector one would think!. The reason is the precedence behavior of subsasgn (which performs this operation) in MATLAB. Doubles have priority, hence, the right-hand-side is cast as a double when the assignment is performed. The code is thus equivalent to

sdpvar x
y = zeros(1,5);
y(5) = value(x)

You can see this more clearly by assigning a value to x

sdpvar x
assign(x,pi)
y = zeros(1,5);
y(5) = x

One solution, among many, is to use concatenation instead

sdpvar x
y = [zeros(1,4) x];

Alternatively, define x as an sdpvar vector and insert zeros, or use the sparse function, etc. A last resort (as it is ugly nonstandard MATLAB code) is to use double2sdpvar

sdpvar x
y = double2sdpvar(zeros(1,5));
y(5) = x;

Bad data to begin with

Crap in crap out. Of course, if you create a model which contains NaNs, you will have NaNs in your model. Hence, check your data!

woops = sin(0);
Model = [x <= 1/woops-1/woops^2];

The variable was never used in the optimization problem

For a variable to have a value, it must have been visible to the optimization problem. Variables which have not been optimized have the default value NaN. In the following model, although we see y in the model, it disappears since it is multiplied with 0, and is thus not part of the model sent to the solver.

sdpvar x y
something = x+y;
Model = [x+0*y <= 1];
optimize(Model,-x);
value(something)
value(y)

The problem was never solved

Did you check your solution status after solving the problem? If the problem wasn’t solved, you will not have any value in any variable.

sdpvar x
sol = optimize(x>=0,x,sdpsettings('solver','cpleeks'))
if sol.problem == 0
 disp('x should have a value')
 value(x)
elseif sol.problem = -3
 disp('Solver not found, so of course x is not optimized')
 value(x)
end

Leave a Comment