最小化t r a c e (S) + t r a c e (小号− 2)trace(S)+trace(S−2)使用 CVX

计算科学 线性代数 matlab 凸优化 简历
2021-12-06 09:13:37

在 Matlab 中,我想最小化函数

f(S)=trace(S)+trace(S2)

其中是对称正定的,绝对是一个凸函数。SMm,m

我尝试了以下代码:

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 正在对问题进行自己的重新表述。S2QQ=S2

我什至尝试以不同的方式解决问题,如下所示:

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}

这意味着函数是一个凹函数。trace(S1/2)

所以我想知道如何以不同的方式编写我的问题以便被 cvx 接受,因为我的函数是凸的。如果有另一种选择而不是 cvx 对我也有用。f(S)=trace(S)+trace(S2)

4个回答

与我在 CVX 论坛上所做的相比,Johan 在这里回答 Bel 的问题的工作肯定做得更完整。但我确实认为这里存在一个值得讨论的概念难题。

在我对 CVX 论坛的回复中,我说“即使你证明它是凸的,你也不能指望 CVX 接受你想要的任何表达式。” Johan 提供了一个解决方案,该解决方案涉及大量重写目标换句话说,YALMIP 也不直接处理该函数,尽管他确实成功地证明了它是可能的。据我所知,目前还没有建模框架可以做到。f(S)=trace(S)+trace(S2)

为了让任何建模框架“处理”特定的表达式,无论是f(S)或任何其他,它需要能够构建与底层求解器兼容的表达式的计算描述。

例如,许多求解器需要代码来计算所涉及表达式的值和导数(通常是前两个)。您可以手动提供这些衍生品——但对于f(S),这绝不是直截了当的。在大多数情况下,自动或符号微分完成了困难的工作——但这​​只有在表达式由 AD/SD 系统已经知道的功能和操作组成时才有效。我不知道处理矩阵表达式的 AD/SD 引擎,例如f(S).

CVX 和 YALMIP 可以使用不同的方法:它们可以构建表达式的图形表示粗略地说,图形表示使用涉及“已知”表达式的方程和不等式来描述“新”不等式的几何形状。一个简单的例子是涉及绝对值的约束:

|x|y
平滑求解器将难以处理不可微分x=0. 但解决方案很简单且众所周知:用两个线性不等式替换约束:
yxy
图形表示让 CVX 和 YALMIP 泛化和自动化这些类型的转换。这些建模框架提供了在严格的函数/导数方法中不可用的各种函数。但是这些库仍然是有限的,这意味着用户必须仅使用提供的函数来构建他们的模型。

Johan 在他的帖子中所做的是展示如何构建f(S)手动,以便可以使用 YALMIP 或 CVX 解决。我有理由确定他的推导是正确的。

建模框架隐藏并自动化将模型从其自然形式转换为机器可解决形式的复杂性。这几乎总是一件好事。但有时,了解众所周知的香肠是如何制作的会很有帮助。使用凸优化框架,仅仅证明您的模型是凸的是不够的。人们仍然必须考虑翻译成可解形式的问题。如果您愿意遵循它们所需的约定,CVX 和 YALMIP 会自动执行此过程。

编辑:如果有人感兴趣,我写了一篇关于图形表示的论文。

我很确定您可以通过对平方逆的迹进行建模,其中满足(使用舒尔补码派生,用于建模/上限的倒数,用于的平方)。因此,可以使用标准 LMI 方法求解。trace(Z)ZX[XIIS]0[ZXXI]0XSZX

以下测试计算固定矩阵的值(在 YALMIP 中,但 CVX 版本类似)S

S = randn(3);S = S*S';
X = sdpvar(3);
Z = sdpvar(3);
BoundInverse = [X eye(3);eye(3) S]>=0;
BoundSquare = [Z X;X eye(3)] >= 0;
solvesdp([BoundInverse, BoundSquare],trace(Z))

% Is the objective equal to trace(S^-2)
trace(inv(S)^2)
double(trace(Z))
% Is Z equal to S^-2 at optimality
norm(double(Z) - S^-2)

...并跟进评论,这里是一个模型,它解决了是决策变量的问题(的 1-范数,目标是 )SSCtrace(S)+trace(S2)

S = sdpvar(3);
C = randn(3);
X = sdpvar(3);
Z = sdpvar(3);
Model = [S >= 0, norm(S-C,1) <= 4];
BoundInverse = [X eye(3);eye(3) S]>=0;
BoundSquare = [Z X;X eye(3)] >= 0;
optimize([Model, BoundInverse, BoundSquare],trace(S) + trace(Z))

非线性等式约束是非凸的,这就是 CVX 不会接受您的问题的原因。

这是一个标量示例:

考虑等式约束x2=y,并考虑其关联的可行集T={(x,y):x2y=0}. 两个都(0,0)(1,1)T. 如果T是一个凸集,那么这条线(z,z)为了z[0,1]应该在T. 然而,(1/2,1/2)不在T, 所以T不是凸的。

无论如何,您的问题的根源可能是Sn, 为了n正整数,和S半正定,不是 CVX 识别为凸的原子表达式。如果你必须自己证明它,我怀疑它在那里,我在这个参考中找不到它如果可以添加Sn作为一个凸的原子表达式,你应该没问题。

如果您想使用fmincon,理论上应该可以,但我认为主要问题是执行以下约束S是半正定的。使用 YALMIP 之类的东西可能会更好,它是许多求解器的前端,包括 SDP 求解器。

您可能希望请 CVX 的作者 Michael Grant 在 CVX 的下一个版本中规范您的功能。

同时,尝试使用 IPOPT 形式的 COIN-OR,它是一个相当强大的非线性规划问题通用求解器。要使其工作,您需要通过替换每次出现的C经过RTR, 在哪里R是具有非负对角元素的上三角矩阵。

由于 IPOPT 期望平滑约束,因此您还需要替换非平滑 L1 约束SC1α(假设 1-范数为列和范数)由平滑约束 其中是全一向量,是新变量的矩阵。

XRTRCX,   eTXαe,
eX