报错情况
错误使用 -
Adding NaN to an SDPVAR makes no sense.
错误分为下列的情况、
- 将 sdpvar 对象指定给 double
一个常见的情况是用户定义了一个 double,然后尝试使用索引在某个位置插入一个 sdpvar 对象sdpvar x y = zeros(1,5); y(5) = x y = NaN 0 0 0 0
显然,这并不是在创建人们想象中的矢量!原因是在 MATLAB 中,subsasgn(执行此操作)的优先级行为。 原因在于 MATLAB 中 subsasgn(执行此操作)的优先级行为。 双倍值具有优先权,因此在执行赋值时,右侧会被当作双倍值。 因此,代码等价于
sdpvar x y = zeros(1,5); y(5) = value(x)
为 x 赋值可以更清楚地看到这一点
sdpvar x assign(x,pi) y = zeros(1,5); y(5) = x
在众多解决方案中,有一种解决方案是使用连接代替
sdpvar x y = [zeros(1,4) x];
或者,将 x 定义为 sdpvar 向量并插入零,或者使用稀疏函数等。 最后的办法(因为它是丑陋的非标准 MATLAB 代码)是使用 double2sdpvar。 这条命令很可能在将来被删除,所以不要依赖它。
sdpvar x y = double2sdpvar(zeros(1,5)); y(5) = x;
另一个解决方法是计算矢量化,使用一些简单的for循环会出现这些问题。
-
数据一开始就很糟糕
垃圾进垃圾出。当然,如果创建了一个包含NaN的模型,我的数据模型中也会有NaN,因此,需要检查数据。woops = sin(0); Model = [x <= 1/woops-1/woops^2];
-
优化问题中从未使用过该变量
一个变量要有一个值,它必须在优化问题中可见。 未被优化的变量默认值为 NaN。 在下面的模型中,虽然我们在模型中看到了 y,但由于它乘以了 0,因此并不属于 YALMIP 模型的一部分,求解器也完全无法使用。 该变量将保持调用求解器之前的值。 由于变量从未被赋值,因此值将为 NaN。
sdpvar x y something = x+y; Model = [x+0*y <= 1]; optimize(Model,-x); value(something) value(y)
- 问题没有被解出来
你在解决问题后检查过解决方案的状态吗? 如果问题没有解决,就不能保证变量已经分配。sdpvar x sol = optimize(x>=0,x,sdpsettings('solver','cplex')) 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