Проверяйте, содержит ли выражение конкретную подэкспрессию
has(
возвращает логический expr
,subexpr
)1
(true), если expr
содержит subexpr
. В противном случае возвращается логический 0
(false).
Если expr
является массивом, has(expr,subexpr)
возвращает массив того же размера, что и expr
. Возвращенный массив содержит логические 1s
(true) где элементы expr
содержат subexpr
, и логические 0s
(ложь) там, где они этого не делают.
Если subexpr
является массивом, has(expr,subexpr)
проверяет, expr
содержит любой элемент subexpr
.
Используйте has
функция, чтобы проверить, содержит ли выражение конкретную переменную или подэкспрессию.
Проверьте, содержат ли эти выражения переменную z
.
syms x y z has(x + y + z, z)
ans = logical 1
has(x + y, z)
ans = logical 0
Проверьте, x + y + z
содержит следующие подэкспрессии. Обратите внимание, что has
находит подэкспрессию x + z
несмотря на то, что условия x
и z
не появляются рядом друг с другом в выражении.
has(x + y + z, x + y) has(x + y + z, y + z) has(x + y + z, x + z)
ans = logical 1 ans = logical 1 ans = logical 1
Проверяйте, (x + 1)^2
ли выражение содержит
x^2
. Хотя (x + 1)^2
математически эквивалентно выражению x^2 + 2*x + 1
, результатом является логическое 0
потому что has
обычно не преобразует выражения в различные формы при проверке на наличие подэкспрессий.
has((x + 1)^2, x^2)
ans = logical 0
Разверните выражение и вызовите has
проверить, содержит ли результат x^2
. Потому что expand((x + 1)^2)
преобразует исходное выражение в x^2 + 2*x + 1
, has
функция находит подэкспрессию x^2
и возвращает логический 1
.
has(expand((x + 1)^2), x^2)
ans = logical 1
Проверьте, содержит ли символьное выражение какие-либо подэкспрессии, заданные в качестве элементов массива вектора.
Если выражение содержит одно или несколько заданных подэкспрессий, has
возвращает логический 1
.
syms x has(sin(x) + cos(x) + x^2, [tan(x), cot(x), sin(x), exp(x)])
ans = logical 1
Если выражение не содержит никаких заданных подэкспрессий, has
возвращает логический 0
.
syms x has(sin(x) + cos(x) + x^2, [tan(x), cot(x), exp(x)])
ans = logical 0
Используя has
, найти те элементы массива символьной матрицы, которые содержат конкретную подэкспрессию.
Сначала создайте матрицу.
syms x y M = [sin(x)*sin(y), cos(x*y) + 1; cos(x)*tan(x), 2*sin(x)^2]
M = [ sin(x)*sin(y), cos(x*y) + 1] [ cos(x)*tan(x), 2*sin(x)^2]
Использовать has
проверить, какие элементы M
содержат sin(x)
. Результатом является матрица того же размера, что и M
, с 1s
и 0s
как его элементы. Для элементов M
содержащее указанное выражение, has
возвращает логический 1s
. Для элементов, которые не содержат этого подэкспрессии, has
возвращает логический 0s
.
T = has(M, sin(x))
T = 2×2 logical array 1 0 0 1
Возвращает только элементы, которые содержат sin(x)
и заменить все другие элементы на 0
путем умножения M
по T
элементарно.
M.*T
ans = [ sin(x)*sin(y), 0] [ 0, 2*sin(x)^2]
Чтобы проверить, содержит ли любой из элементов матрицы конкретную подэкспрессию, используйте any
.
any(has(M(:), sin(x)))
ans = logical 1
any(has(M(:), cos(y)))
ans = logical 0
Используя has
, найдите те элементы массива символьного вектора, которые содержат любое из заданных подэкспрессий.
syms x y z T = has([x + 1, cos(y) + 1, y + z, 2*x*cos(y)], [x, cos(y)])
T = 1×4 logical array 1 1 0 1
Возвращает только элементы исходного вектора, которые содержат x
или cos(y)
или обоих, и заменить все другие элементы на 0
умножением исходного вектора на T
элементарно.
[x + 1, cos(y) + 1, y + z, 2*x*cos(y)].*T
ans = [ x + 1, cos(y) + 1, 0, 2*x*cos(y)]
has
для символьных функцийЕсли expr
или subexpr
является символической функцией, has
использует formula(expr)
или formula(subexpr)
. Этот подход позволяет has
функция проверяет, является ли выражение, определяющее символьную функцию expr
содержит выражение, определяющее символьную функцию subexpr
.
Создайте символическую функцию.
syms x f(x) = sin(x) + cos(x);
Здесь, sin(x) + cos(x)
- выражение, определяющее символьную функцию f
.
formula(f)
ans = cos(x) + sin(x)
Проверьте, f
и f(x)
содержат sin(x)
. В обоих случаях has
проверяет, является ли выражение sin(x) + cos(x)
содержит sin(x)
.
has(f, sin(x)) has(f(x), sin(x))
ans = logical 1 ans = logical 1
Проверьте, f(x^2)
содержит f
. Для этих аргументов, has
возвращает логический 0
(false), поскольку он не проверяет, является ли выражение f(x^2)
содержит букву f
. Этот вызов эквивалентен has(f(x^2), formula(f))
, который, в свою очередь, решается на has(cos(x^2) + sin(x^2), cos(x) + sin(x))
.
has(f(x^2), f)
ans = logical 0
Проверьте наличие вызовов конкретной функции путем определения имени функции в качестве второго аргумента. Проверяйте на вызовы любой из нескольких функций путем определения нескольких функций как массива ячеек из векторов символов.
Интеграция tan(x^7)
. Определите, является ли интегрирование успешной, путем проверки результата на вызовы к int
. Поскольку has
находит int
function и возвращает логический 1
(true
), интегрирование не является успешной.
syms x f = int(tan(x^7), x); has(f, 'int')
ans = logical 1
Проверьте, содержит ли решение дифференциального уравнения вызовы к любому из sin
или cos
путем определения второго аргумента следующим {'sin','cos'}
. has
функция возвращает логический 0
(false
), что означает, что решение не содержит вызовов ни на sin
или cos
.
syms y(x) a sol = dsolve(diff(y,x) == a*y); has(sol, {'sin' 'cos'})
ans = logical 0
has
не преобразует и не упрощает выражения. Вот почему он не находит такие подэкспрессии, как x^2
в выражениях, таких как (x + 1)^2
. Однако в некоторых случаях has
может оказаться, что выражение или подэкспрессия могут быть представлены в форме, отличной от его исходной формы. Для примера, has
находит, что выражение -x - 1
может быть представлена как -(x + 1)
. Таким образом, вызов has(-x - 1, x + 1)
возвращает 1
.
Если expr
- пустой символьный массив, has
возвращает пустой логический массив того же размера, что и expr
.