0

У меня проблема с использованием YALMIP; Я подозреваю, что делаю что-то глупое, и я был бы очень признателен, если бы кто-то сказал, что это такое.YALMIP возвращает, что программа является недопустимой, когда она не является

Я пытаюсь решить некоторые SDP. Когда я не определяю цель, YALMIP возвращает решение (подразумевая, что проблема возможна). Однако, когда я прикрепляю к нему цель, YALMIP возвращает, что проблема недопустима, что немного меня озадачило.

Вот код для простейшего SDP, который я мог бы приготовить, в котором происходит это. Объявление переменных и установления ограничений выглядит следующим образом:

y = sdpvar(6,1); 
M = sdpvar(3,3); 

C = [0,0,0,0,0,0; 0,0,0,0,0,0; -2,0,1.8,0,2,1; 0,0,0,0,0,0; 1,0,-1,0,-1.2,0; 
    0,0,0,0,0,0;]; 

F = [C*y==0, y(6) == 1, M>=0]; 

F = [F,M(1,1) == y(1), M(2,1) == y(2), M(3,1) == y(3),... 
    M(2,2) == y(4), M(3,2) == y(5), M(3,3) == y(6)]; 

Теперь, если я просто попросить YALMIP найти допустимое решение с

solvesdp(F) 

возвращает

info: 'Successfully solved (LMILAB)' 
problem: 0 

и некоторые выполнимо M и y (я проверял, что они действительно есть). Тем не менее, если я добавляю цель «минимизировать у (3)» (или вообще любая линейная комбинация элементов матрицы у) с

solvesdp(F,y(3)) 

она возвращает, что задача неразрешима:

info: 'Infeasible problem (LMILAB)' 
problem: 1 

и y и M полны токенов «NaN».

Большое спасибо заранее.

ответ

2

LMILAB не должен использоваться вместе с YALMIP.

http://users.isy.liu.se/johanl/yalmip/pmwiki.php?n=Solvers.LMILAB

Решатель в LMILAB имеет много недостатков, и один, который становится решающим здесь является тот факт, что решатель не хватает поддержки неравенств. Чтобы обойти это, YALMIP добавляет двусторонние неравенства, что полностью разрушает числовые процедуры LMILAB.

Установите более общий (и современный) решатель, такие как SeDuMi, SDPT3 или Mosek

http://users.isy.liu.se/johanl/yalmip/pmwiki.php?n=Category.SemidefiniteProgrammingSolver

Кстати, вы избыточно, определяющие дополнительные переменные у. Нет причин, чтобы иметь их как отдельные переменные решения и затем закодировать, как они относятся к M. Просто распакуйте их

y = M(find(tril(ones(3)))); 
+0

Привет Johan, спасибо за ответ (и большое спасибо за сделать YALMIP доступный онлайн в первую очередь!). – jkn