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