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 состоит из двух символов, {}
, но он отображается как один, Ø, имеет длину один и означает пустое / ноль.) Возможно, есть и другие способы.