Проблема с Matlab: linprog

Добрый вечер,

У меня проблема с функцией linprog в Matlab, вот сообщение, которое я получаю:

Выход из-за невозможности: строка со всеми нулями в матрице ограничений не имеет нуля в соответствующей правой части.

Согласно справке, это означает, что у меня есть хотя бы строка в Aeq, полная нулей (скажем, строка i), но beq(i) не равна нулю.

Я проверил свои матрицы:

checkmat=full(sum(abs(Aeq')))';
checkmat=horzcat(checkmat,beq);

for i=1:length(checkmat)
   if (checkmat(i,1)==0 && checkmat(i,2)~=0) || (checkmat(i,2)==0 && checkmat(i,1)~=0)
      i
   end
end

но вроде нормально. Кто-нибудь знает, откуда это могло взяться? Если отсутствует какая-либо информация, я с удовольствием попытаюсь ее собрать.


person qnilab    schedule 21.12.2012    source источник


Ответы (1)


Метод внутренней точки по умолчанию, используемый linprog, выполняет некоторые шаги предварительной обработки до начала фактических итераций. Поэтому, хотя ваш Aeq может не содержать нулевой строки, для которой соответствующий элемент beq не равен нулю, это может произойти после предварительной обработки.

Вы можете попробовать запустить linprog, используя другой алгоритм (используйте optimset('LargeScale', 'off') и/или optimset('LargeScale', 'off', 'Simplex', 'on')) и посмотреть, что получится в этом случае.

Однако я подозреваю, что во всех случаях вы получите флаг выхода «неразрешимая проблема», поскольку ваши ограничения равенства кажутся невозможными для удовлетворения.

Дополнительная информация о доступных алгоритмах линейного программирования Matlab и их предварительной обработке шаги.

person 3lectrologos    schedule 22.12.2012
comment
Большое Вам спасибо. Почему-то симплекс-метод кажется гораздо более стабильным... Мое равенство удалось удовлетворить. Произошло нечто странное: я попытался найти максимальное количество энергии, которую можно получить с помощью сети плотин, зная ежемесячные сбросы за 80 лет. В период наводнения вы не можете использовать всю воду для производства энергии, поэтому вы открываете двери без каких-либо ограничений в моей модели. Таким образом, у меня была неограниченная переменная решения, которая мне была нужна в ограничениях равенства (гидравлический баланс). Если переменная ограничена между 0 и inf, она не работает, но 0 и 100^1000 в порядке... Загадка. - person qnilab; 27.12.2012