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
, потому что отношения содержит только с действительными объектами. См. Пример 4.
Это может произойти тот is
возвращает UNKNOWN
, несмотря на то, что запрошенное свойство содержит математически. См. Пример 5.
В MuPAD®, там также существует функциональный bool
проверять отношение y rel z
. Однако между bool
существует два основных отличий и
is
:
См. пример 3.
Если bool(y rel z)
возвращает TRUE
, затем так делает is(y rel z)
. Однако is
более мощно, чем bool
, даже когда никакие свойства не включены. См. Пример 3. С другой стороны, is
обычно намного медленнее, чем bool
.
Будьте осторожны при использовании is
в условии if
оператор или for
в то время как
, или repeat
цикл: эти построения не могут обработать значение UNKNOWN
. Используйте любой is(...) = TRUE
или case
оператор. См. Пример 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
повторение
в то время как
циклы:
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:
|
Условие |
| |
|
Свойство, представляющее набор чисел (например, |