与えられた 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 の任意の値に対して発生します。
この問題は扱いやすいので、行列を対角化し、3 つの固有値が次の多項式の 3 つの根であることを直接取得しました。
16*t^3 - 36*t^2 + (24 - 16*a*b - v^2)*t + (-4 + 4*a*b + v^2)
3 つの根の値を数値的に計算すると、そのうちの 3 つが 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'))
その後、エラーは「実行不可能な問題」エラーに変わります。