MuPAD: Как определить только существование решений для набора линейных неравенств?

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

введите описание изображения здесь

который я решаю в MuPAD:

solve({x+z>2*y,z>y,2*z>2*x,x>0,y>0,z>0},{x,y,z}

MuPAD возвращает набор решений в некоторой записи:

введите описание изображения здесь

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

Я хотел бы позвонить в MuPAD из Matlab, спросить, существует ли набор решений для неравенств, а затем получить ответ "да" или "нет". Я мог бы проверить, возвращается ли пустой набор, но я не знаю, как проверить, представляет ли символическая переменная пустой набор.

1 ответ

Решение

Вот пример использования MuPAD solve а также sym/isempty звонил из Matlab:

syms x y z;
~isempty(feval(symengine,'solve',[x+z>2*y,z>y,2*z>2*x,x>0,y>0,z>0],[x y z]))
~isempty(feval(symengine,'solve',[x+z>2*y,z>y,2*z>2*x,x>0,y>0,z<0],[x y z]))

Первый случай возвращает true, 1, указывая, что есть хотя бы одно решение. Вторая возвращает ложь, 0, так как нет решения.

Если вы хотите сделать это в MuPAD, вы можете использовать is функция:

not(is(solve([x+z>2*y,z>y,2*z>2*x,x>0,y>0,z>0],[x,y,z])={}))
not(is(solve([x+z>2*y,z>y,2*z>2*x,x>0,y>0,z<0],[x,y,z])={}))

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

is(length(solve([x+z>2*y,z>y,2*z>2*x,x>0,y>0,z>0],[x,y,z]))>1)
is(length(solve([x+z>2*y,z>y,2*z>2*x,x>0,y>0,z<0],[x,y,z]))>1)

что предполагает, что только пустое решение Ø будет иметь length одного. (Код MuPAD состоит из двух символов, {}, но он отображается как один, Ø, имеет длину один и означает пустое / ноль.) Возможно, есть и другие способы.

Другие вопросы по тегам