Проверяйте, содержит ли выражение конкретную подэкспрессию
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.