通信仿真中CVX求解遇到的问题小记

问题一:Error using * (line 数字)
Disciplined convex programming error:
Invalid numeric values (NaNs) may not be used in CVX expressions.

当时碰到这个问题,不是非常明白错误原因即如何修改错误。网上唯一提及该错误的在CVX forum里,对我个人价值不大,而且我觉得也没怎么解释如何修改,只是知道所涉及的某些量是NaN(不是个数,就空空的),把这个NaN改掉程序应该就不会报错了。

问题在如何解决这个NaN。我在报错处(line 数字)加入断点,进行查看,发现步进的时候没有报错,跑完该CVX也没报错。当再继续的时候就开始进行报错。后来发现(此处说明,我的代码涉及到迭代,因此是第一个CVX的结果传递给下一个CVX进行计算,循环往复直至达到我设定的条件),由此可知我第一个CVX的状态是infeasible,所有求解的结果值为NaN,传递给下一个CVX,CVX必然不能够处理NaN的参数,所以报错。因此,我需要调整我的各项参数以及初始值,使得第一个CVX的状态是feasible的,完成该项操作后,不再报错。(同时,我回忆起之前就恍然大悟了,这个错时有发生,有时没做啥操作就好了,不报错了,应该是当时第一个CVX有时有解有时无解,有解时就不报错了。而我后续修改了参数及代码,使得第一个CVX有解的概率大大降低,因此几乎每跑一次都会出现错误,所以就必须着手解决。)

问题二:错误使用  * 
Disciplined convex programming error:

Only scalar quadratic forms can be specified in CVX

CVX有着其严格的规则,可能两个表达式表述的含义一样,但它只认为自己默认的那种情况是正确。(具体可以看看这个:The DCP ruleset — CVX Users' Guide (cvxr.com))。

我这里出现该错误是因为,一开始我采用SDR的方法,F = f  * f ',用迹表示即trace(F),是完全可以的,而后来,我直接采用trace( f  * f ' ),出现该报错,理论上这两个玩意一模一样,不应该出现报错,这里就是上述所说,我这样写不符合它的严格规则,因此出错,即这里二次型它不认,只能表示成一次。由于我这样写trace( f  * f ' )是不想用SDR,想直接求解得到f,因此我只好老老实实把trace的结果用表达式表示出来,解决该报错。

问题三:错误使用 cvxprob/newcnstr
Disciplined convex programming error: Invalid constraint: {convex} <= {complex constant}

这里报错在于我的约束,我左边是个凸的表达式,右边是个复常数。根据我朴素的理解,包括之前看到他人约束中采用real(表达式)<= 常数 (当时不理解为啥要加real,不过也不知道现在的理解是否正确),我把右边的加上了real(),报错就消失啦。因此我后面看到报错中涉及complex就加上real()解决。

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值