在 Matlab 中,我想最小化函数
其中是对称正定的,绝对是一个凸函数。
我尝试了以下代码:
cvx_solver sdpt3
cvx_begin quiet
variable S(m,m) symmetric;
S == semidefinite(m);
minimize (trace(S)+trace_inv(square(S)));
cvx_end
运行此程序后,我收到以下错误:
??? Error using ==> cvx.trace_inv at 9
Input must be affine.
实际上这意味着写在代码中的内容等价于约束中的二次等式。也就是说,如果我们将代码中的替换为另一个矩阵,我们必须添加约束这是凸等式,因为它是二次的,而为了得到凸优化问题,我们必须具有仿射约束等式和/或凸不等式。然而,实际上,这不是真的,因为我的函数是凸的,我没有施加任何约束,但 cvx 正在对问题进行自己的重新表述。
我什至尝试以不同的方式解决问题,如下所示:
cvx_solver sdpt3
cvx_begin quiet
variable Q(m,m) symmetric;
Q == semidefinite(m);
minimize (trace_sqrtm(Q) + trace_inv(Q));
cvx_end
S=sqrtm(Q);
但我收到以下错误:
??? Error using ==> cvx.plus at 83
Disciplined convex programming error:
Illegal operation: {concave} + {convex}
这意味着函数是一个凹函数。
所以我想知道如何以不同的方式编写我的问题以便被 cvx 接受,因为我的函数是凸的。如果有另一种选择而不是 cvx 对我也有用。