问题一: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()解决。