# 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