is

Проверяйте математическое свойство выражения

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.

Синтаксис

is(cond)
is(ex, set)

Описание

is(cond) проверяет, содержит ли условие cond для всех возможных значений.

is(ex, set) проверяет, находится ли выражение ex в наборе set.

Механизм свойства помогает упростить выражения включающие выражения, которые несут “математические свойства”. Функциональный assume позволяет принимать, что “предположения”, такие как 'x являются вещественным числом', или 'x является нечетным целым числом' к идентификатору x, сказать. Арифметические выражения, включающие x, могут наследовать такие свойства. Например, '1 + x^2 положителен', если 'x является вещественным числом'. Функциональный is является основным инструментом для запроса математических свойств.

is запрашивает предположения обо всех включенных идентификаторах и проверках, содержит ли условие cond для всех возможных значений. Если это верно, затем is возвращает TRUE. Если is выводит тот cond, не удовлетворен никаким возможным значением, это возвращает FALSE. В противном случае is возвращает UNKNOWN.

Если отношение дано is, и операнды являются комплексными числами или идентификаторами с этим свойством, is возвращает FALSE, потому что отношения содержат только с действительными объектами. Cf. Пример 4.

Это может произойти, что is возвращает UNKNOWN, несмотря на то, что запрошенное свойство содержит математически. Cf. Пример 5.

В MuPAD®, там также существует функциональный bool, чтобы проверять отношение y rel z. Однако существует два основных отличий между bool и is:

  1. bool производит ошибку, если он не может решить, содержит ли отношение или нет; is(y rel z) возвращает UNKNOWN в этом случае.

  2. bool не принимает свойства во внимание.

Cf. Пример 3.

Если bool(y rel z) возвращает TRUE, то так делает is(y rel z). Однако is более мощен, чем bool, даже когда никакие свойства не включены. Cf. Пример 3. С другой стороны, is обычно намного медленнее, чем bool.

Примечание

Будьте осторожны при использовании is в условии оператора if или for, while или цикла repeat: эти построения не могут обработать значение UNKNOWN. Используйте или is(...) = TRUE или оператор case. Cf. Пример 6.

Если is должен проверять, является ли постоянное символьное выражение нулем, то это может использовать эвристический числовой нулевой тест на основе оценки с плавающей точкой. Несмотря на внутреннюю числовую стабилизацию, этот нулевой тест может дать неправильный ответ в исключительных патологических случаях; в таком случае is может возвратить неправильный результат также.

Примеры

Пример 1

Идентификатор x принят, чтобы быть целым числом:

assume(x, Type::Integer):
is(x, Type::Integer), is(x > 0), is(x^2 >= 0)

Идентификатор x принят, чтобы быть положительным вещественным числом:

assume(x > 0):
is(x > 1), is(x >= 0), is(x < 0)

unassume(x):

Пример 2

is может вывести определенные факты, даже когда никакие свойства не были приняты явным образом:

is(x > x + 1), is(abs(x) >= 0)

is(Re(exp(x)), Type::Real)

Пример 3

Для отношений между числами is приводит к тем же ответам как bool:

bool(1 > 0), is(1 > 0)

is разрешает больше постоянных символьных выражений, чем bool:

is(sqrt(14) <= sqrt(2)*sqrt(7)),
is(sin(10^20) > 0),
is(sqrt(2) > 1.41)

bool(sqrt(14) <= sqrt(2)*sqrt(7))
Error: Unable to evaluate to Boolean. [_leequal]
bool(sin(10^20) > 0)
Error: Unable to evaluate to Boolean. [_less]
is(exp(5), Type::Real), is(PI, Type::PosInt)

Пример 4

В следующем примере дано отношение со сложными объектами, возвращенным значением является FALSE:

is(0 < I), is(I + 1 > I), is(1 + 2*I <= 2 + 3*I)

Идентификатор в следующем примере принят, чтобы быть комплексным, но это могло быть действительно также:

assume(x, Type::Complex):
is(x > 0)

Следующее отношение является ложным, или идентификатор, x действителен, затем отношение является ложным, или идентификаторы не действительно, затем сравнение недопустимо:

unassume(x):
is(x + 1 < x)

unassume(x):

Пример 5

Вот некоторые примеры, где запрошенное свойство может быть выведено математически. Однако текущая реализация is еще не достаточно сильна, чтобы вывести свойство:

assume(x in Z_ and y in Z_ and x^2 + y^2 = 2);
is(x > 1)

unassume(x):

Пример 6

Необходимо соблюдать осторожность при использовании is в операторах if или for, repeat, циклах while:

myabs := proc(x)
         begin
           if is(x >= 0) then
             x
           elif is(x < 0) then
             -x
           else
             procname(x)
           end_if
         end_proc:
assume(x < 0): myabs(1), myabs(-2), myabs(x)

Когда вызов is возвращает UNKNOWN, ошибка происходит, потому что if ожидает TRUE или FALSE:

unassume(x): myabs(x)
Error: Unable to evaluate to Boolean. [if]
  Evaluating: myabs

Самым легким способом достигнуть желаемой функциональности является сравнение результата is с TRUE:

myabs := proc(x)
         begin
           if is(x >= 0) = TRUE then
             x
           elif is(x < 0) = TRUE then
             -x
           else
             procname(x)
           end_if
         end_proc:
myabs(x)

delete myabs:

Пример 7

is может обработать наборы, возвращенные solve. Они включают интервалы типа Dom::Interval и R_ = solvelib::BasicSet(Dom::Real):

assume(x >= 0 and x <= 1):
is(x in Dom::Interval([0, 1])), is(x in R_)

Следующая команда solve возвращает решение как бесконечный параметризованный набор типа Dom::ImageSet:

unassume(x): solutionset := solve(sin(x) = 0, x)

domtype(solutionset)

is может использоваться, чтобы проверять, содержится ли выражение в этом наборе:

is(20*PI in solutionset), is(PI/2 in solutionset)

delete solutionset:

Параметры

cond

Условие

ex

арифметическое выражение

set

Свойство, представляющее набор чисел (например, Type::PosInt) или набор, возвращенный solve; такой набор может быть элементом Dom::Interval, Dom::ImageSet, piecewise или одного из C_, R_, Q_, Z_.

Возвращаемые значения

TRUE, FALSE или UNKNOWN.

Смотрите также

Функции MuPAD