使用线性矩阵不等式在matlab求解报错情况

报错情况

错误使用  - 
Adding NaN to an SDPVAR makes no sense.

错误分为下列的情况、

  1. 将 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循环会出现这些问题。

  2. 数据一开始就很糟糕
    垃圾进垃圾出。当然,如果创建了一个包含NaN的模型,我的数据模型中也会有NaN,因此,需要检查数据。

    woops = sin(0);
    Model = [x <= 1/woops-1/woops^2];
  3. 优化问题中从未使用过该变量
    一个变量要有一个值,它必须在优化问题中可见。 未被优化的变量默认值为 NaN。 在下面的模型中,虽然我们在模型中看到了 y,但由于它乘以了 0,因此并不属于 YALMIP 模型的一部分,求解器也完全无法使用。 该变量将保持调用求解器之前的值。 由于变量从未被赋值,因此值将为 NaN。
     

    sdpvar x y
    something = x+y;
    Model = [x+0*y <= 1];
    optimize(Model,-x);
    value(something)
    value(y)
  4. 问题没有被解出来
    你在解决问题后检查过解决方案的状态吗? 如果问题没有解决,就不能保证变量已经分配。
    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值