Проверяйте, содержит ли выражение конкретное подвыражение
has(expr,subexpr)
has(
возвращает логический expr
,subexpr
)1
, (TRUE), если expr
содержит subexpr
. В противном случае возвращается логический 0 (false).
Если expr
является массивом, has(expr,subexpr)
возвращает массив, одного размера как expr
. Возвращенный массив содержит логический 1s
, (TRUE), где элементы expr
содержат subexpr
и логический 0s
, (FALSE), где они не делают.
Если 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
функционирует, и возвращает логический 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
.