我想确定给定的 3x3 矩阵是否为半正定矩阵。为此,我在 YALMIP 中编写了以下 SDP
v=0.2;
a=sdpvar(1);
b=sdpvar(1);
M=[1 a -v/4 ; b 1 0 ; -v/4 0 0.25];
x=sdpvar(1);
optimize([M+x*eye(3)>=0],x,sdpsettings('solver','sedumi'))
这个程序给了我错误“双重不可行,找到原始改进方向”。这发生在区间 (0,1] 中的任何 v 值。
鉴于这个问题是易于处理的,我直接对矩阵进行对角化,得到三个特征值是以下多项式的三个根
16*t^3 - 36*t^2 + (24 - 16*a*b - v^2)*t + (-4 + 4*a*b + v^2)
以数字方式计算三个根的值我看到它们三个对于 sign(a)=sign(b) 是正的(除了 a,b=+-1 附近的一个小区域),对于任何值v. 因此,SDP 应该毫无问题地运行并输出 x 的负值,而不会产生进一步的复杂性。
为了让事情变得更有趣,我使用以下矩阵运行了相同的代码
M=[1 a v/4 ; b 1 0 ; v/4 0 0.25];
该矩阵与前一个矩阵具有相同的特征值,在这种情况下程序运行没有任何问题,确认该矩阵确实是半正定的。
我真的很好奇这个问题的性质,任何帮助将不胜感激。
编辑:我也尝试了 SDPT3 求解器,结果非常相似。事实上,程序在 +v 的情况下运行顺利,但是当我输入减号时,我得到以下错误
'Unknown problem in solver (Turn on 'debug' in sdpsettings) (Error using & …'
此外,当我对变量添加一些限制时,即运行以下命令
optimize([total+w*eye(3)>=0,-1<=a<=1,-1<=b<=1],w,sdpsettings('solver','sdpt3'))
然后错误变成“不可行的问题”错误。