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:
|
Условие |
| |
|
Свойство, представляющее набор чисел (например, |