0

与えられた 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'))

その後、エラーは「実行不可能な問題」エラーに変わります。

4

1 に答える 1

2

遅い答えですが、とにかく。指定した行列は対称ではありません。半正定値プログラミングは、一連の正の対称正値行列に対する最適化に関するものです。

この非対称行列制約を YALMIP で定義すると、単純に 9 つの要素ごとの線形制約のセットとして解釈され、その線形プログラムでは、最適な x は無制限になります。

于 2016-09-13T12:29:34.037 に答える