# has
检查表达式是否包含特定的子表达式
函数库: TySymbolicMath
# 语法
# 说明
has(expr,subexpr) 如果 expr 包含 subexpr,则返回 true。否则,返回 false。示例
- 如果 expr 是数组,has(expr,subexpr) 返回与 expr 相同大小的数组。如果 expr 的元素包含 subexpr,则返回的数组的对应位置为 true,如果不包含 subexpr,则返回的数组的对应位置为 false;
- 如果 subexpr 是数组,has(expr,subexpr) 会检查 expr 是否包含 subexpr 的任意一个元素。
# 示例
检查表达式是否包含特定的子表达式
使用 has 函数检查表达式是否包含特定变量或子表达式。
检查这些表达式是否包含变量 z。
using TySymbolicMath
@variables x y z
has(x + y + z, z)
ans = true
has(x + y, z)
ans = false
检查 x + y + z 是否包含以下子表达式。请注意,即使 x 和 z 在表达式中并不相邻,has 也能找到子表达式 x + z。
res1 = has(x + y + z, x + y)
res2 = has(x + y + z, y + z)
res3 = has(x + y + z, x + z)
res1 = true
res2 = true
res3 = true
检查表达式 (x + 1)^2 是否包含 x^2。虽然 (x + 1)^2 在数学上等价于表达式 x^2 + 2*x + 1,但结果却是 false,因为在测试子表达式时,has 函数通常不会将表达式转换为不同的形式。
has((x + 1)^2, x^2)
ans = false
展开表达式,然后调用 has 函数检查结果是否包含 x^2。由于 expand((x + 1)^2 会将原始表达式转换为 x^2 + 2*x + 1,因此 has 函数会找到子表达式 x^2 并返回 true。
has(expand((x + 1)^2), x^2)
ans = true
检查表达式是否包含任意一个指定的子表达式
检查符号表达式是否包含由子表达式为元素的向量中的任意一个子表达式。
如果表达式包含一个或多个指定的子表达式,则返回 true。
using TySymbolicMath
@variables x
has(sin(x) + cos(x) + x^2, [tan(x), cot(x), sin(x), exp(x)])
ans = true
如果表达式不包含任何指定的子表达式,则返回 false。
@variables x
has(sin(x) + cos(x) + x^2, [tan(x), cot(x), exp(x)])
ans = false
查找包含特定子表达式的矩阵元素
使用 has 函数查找符号矩阵中包含特定子表达式的元素。
首先,创建一个矩阵。
using TySymbolicMath
@variables x y
M = [sin(x)*sin(y) cos(x*y) + 1; cos(x)*tan(x) 2*sin(x)^2]
M = 2×2 Matrix{Num}:
sin(x)*sin(y) 1 + cos(x*y)
cos(x)*tan(x) 2(sin(x)^2)
使用 has 函数检查 M 中哪些元素包含 sin(x)。结果是一个大小与 M 相同的矩阵,其元素为 1 和 0。对于 M 中包含指定表达式的元素,has 返回逻辑 1(true)。对于不包含该子表达式的元素,has 返回逻辑 0(false)。
T = has(M, sin(x))
T = 2×2 BitMatrix:
1 0
0 1
只返回包含 sin(x) 的元素,并将 M 乘以 T,将所有其他元素替换为 0。
M.*Int.(T)
ans = 2×2 Matrix{Num}:
sin(x)*sin(y) 0
0 2(sin(x)^2)
要检查矩阵元素中是否有包含特定子表达式的元素,请使用 any。
any(has(vec(M), sin(x)))
ans = true
any(has(vec(M), cos(y)))
ans = false
查找包含任意指定子表达式的向量元素
使用 has 函数查找符号向量中的元素是否包含任意一个指定子表达式。
如果表达式包含一个或多个指定的子表达式,则返回 true。
using TySymbolicMath
@variables x y z
T = has([x + 1 cos(y) + 1 y + z 2*x*cos(y)], [x, cos(y)])
T = 1×4 BitMatrix:
1 1 0 1
只返回原始向量中包含 x 或 cos(y) 或两者的元素,并通过将原始向量乘以 T 元素,将所有其他元素替换为 0。
[x + 1 cos(y) + 1 y + z 2*x*cos(y)].*Int.(T)
ans = 1×4 Matrix{Num}:
1 + x 1 + cos(y) 0 2x*cos(y)
对符号函数使用 has 函数
has 函数可以检查符号函数 expr 的表达式是否包含符号函数 subexpr 的表达式。
创建一个符号函数。
using TySymbolicMath
@variables x
f_has(x) = sin(x) + cos(x)
检查 f(x) 是否包含 sin(x),即检查 sin(x) + cos(x) 的表达式是否包含 sin(x)。
has(f_has(x), sin(x))
ans = true
检查 f(x^2) 是否包含 f(x)。对于这些参数,has 函数返回 false,因为它不检查表达式 f(x^2) 是否包含字母 f。该调用等价于 has(cos(x^2) + sin(x^2), cos(x) + sin(x))。
has(f_has(x^2), f_has(x))
ans = false
检查对特定函数的调用
通过指定函数名作为第二个参数,检查对特定函数的调用。通过将多个函数指定为字符串向量,检查对多个函数中任何一个函数的调用。
对 tan(x^7) 积分。通过检查结果中对 int 的调用,确定积分是否成功。由于找到了 int 函数并返回 true,因此积分没有成功。
using TySymbolicMath
@variables x
f = int(tan(x^7), x)
has(f, "int")
ans = true
通过指定第二个参数为 ["sin","cos"] 来检查符号表达式是否包含对 sin 或 cos 函数的调用。has 函数返回 false,表示该符号表达式不包含对 sin 或 cos 函数的调用。
@variables x y
has(exp(x) + tan(y) + x^2, ["sin", "cos"])
ans = false
# 输入参数
expr - 要检查的表达式符号表达式 | 符号函数 | 符号等式 | 符号不等式 | 符号向量 | 符号矩阵 | 符号数组
要检测的表达式,指定为符号表达式、符号函数、符号等式或符号不等式。也可以是由符号表达式、符号函数、符号等式或符号不等式构成的符号向量、符号矩阵或符号数组。
subexpr - 要检查的子表达式符号变量 | 符号表达式 | 符号函数 | 符号等式 | 符号不等式 | 符号向量 | 符号矩阵 | 符号数组 | 字符串 | 字符串向量
要检查的子表达式,指定为符号变量、符号表达式、符号函数、符号等式、符号不等式、字符串或字符串向量。也可以是由符号变量、符号表达式、符号函数、符号等式或符号不等式构成的符号向量、符号矩阵或符号数组。
# 提示
- has 函数并不能转换或简化表达式。这就是为什么它不会在 (x + 1)^2 这样的表达式中找到 x^2 这样的子表达式。不过,在某些情况下,has 函数可能会发现表达式或子表达式可以用其原始形式以外的其他形式表示。例如,has 函数发现表达式 -x - 1 可以表示为 -(x+1)。因此,调用 has(-x - 1, x + 1) 返回 true;
- 如果 expr 是一个空符号数组,则 has 函数返回一个与 expr 大小相同的空逻辑数组。