Я хочу определить, является ли данная матрица 3x3 положительно-полуопределенной или нет. Для этого я пишу следующий SDP в YALMIP
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'))
Эта программа выдает ошибку "Обнаружено двойное невыполнимое, основное направление улучшения". Это происходит для любого значения v в интервале (0,1].
Учитывая, что эта проблема решаема, я диагонализировал матрицу напрямую, получив, что три собственных значения являются тремя корнями следующего многочлена
16*t^3 - 36*t^2 + (24 - 16*a*b - v^2)*t + (-4 + 4*a*b + v^2)
Вычисляя значения трех корней численно, я вижу, что три из них положительны при знаке (а) = знаке (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'))
Затем ошибка превращается в ошибку «Неразрешимая проблема».