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 (я проверил, что они действительно есть). Однако, если я добавлю цель «минимизировать y (3)» (или любую линейную комбинацию элементов y) с

solvesdp(F,y(3))

он возвращает, что проблема неразрешима:

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

а y и M заполнены токенами "NaN".

Спасибо заранее.


person jkn    schedule 11.12.2013    source источник


Ответы (1)


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

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

y = M(find(tril(ones(3))));
person Johan Löfberg    schedule 12.12.2013
comment
Привет, Йохан, спасибо за ответ (и большое спасибо за то, что вы сделали YALMIP доступным онлайн!). - person jkn; 12.12.2013