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
:
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
может возвратить неправильный результат также.
Идентификатор 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):
is
может вывести определенные факты, даже когда никакие свойства не были приняты явным образом:
is(x > x + 1), is(abs(x) >= 0)
is(Re(exp(x)), Type::Real)
Для отношений между числами 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)
В следующем примере дано отношение со сложными объектами, возвращенным значением является 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):
Вот некоторые примеры, где запрошенное свойство может быть выведено математически. Однако текущая реализация is
еще не достаточно сильна, чтобы вывести свойство:
assume(x in Z_ and y in Z_ and x^2 + y^2 = 2); is(x > 1)
unassume(x):
Необходимо соблюдать осторожность при использовании 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:
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:
|
Условие |
| |
|
Свойство, представляющее набор чисел (например, |