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