如何在 SymPy 中查找表达式中是否包含复数 I?

How to find if expression contains complex number I in it in SymPy?

给定一个表达式,如果表达式包含复数 I,即 −1 的平方根,我如何找到(如果需要,在简化之后)?

在 Maple 中,这是使用检查 has(expression,I) 完成的;查看其 help page.

在 Mathematica 中,这是使用检查 If[FreeQ[expression, Complex] 完成的,例如:How to check if expression contains a Complex expression?

但我不确定如何在 SymPy 中做类似的事情。

使用 expression.is_complex 不会 return True 即使在表达式中使用 I。此外,由于实数是复数的子集,因此无论如何这都不是正确的测试。

我需要检查出现在表达式中任何地方(简化后)的显式 I

这是一个例子:我正在使用 SymPy 1.5。

from sympy import *
from sympy.abc import z
ex1=(-(((1 + 3*I) + sqrt(2))*cos(z/2)) + ((1 + I) - I*sqrt(2))*sin(z/2))/(((1 + I) + sqrt(2))*cos(z/2) + I*((-1 -I) + sqrt(2))*sin(z/2))
print(ex1.is_complex)
    #None
print(simplify(ex1).is_complex)
    #None

这是在枫树中,供参考:

restart;
result:=(-(((1 + 3*I) + sqrt(2))*cos(z/2)) + ((1 + I) - I*sqrt(2))*sin(z/2))/(((1 + I) + sqrt(2))*cos(z/2) + I*((-1 -I) + sqrt(2))*sin(z/2));
has(simplify(result),I)

给出

如何在 SymPy 中执行上述操作?

has 检查表达式是否包含某些子表达式,例如 I:

ex1.has(I)        # True
sin(z).has(I)     # False
(sin(z)+I).has(I) # True

请注意,这并未考虑可能会消除 I 的简化。

至于像 is_complex 这样的检查,他们会考虑输入变量的所有可能值和 return None 如果没有明确的答案(或者如果 SymPy 没有看到相关的简化)。此外,在你的情况下,你想使用 is_real (因为实数在 SymPy 的意义上也是复杂的,正如你所指出的)。为了便于说明,请考虑以下内容:

z = Symbol("z")
(z+1).is_real  # None
(z+I).is_real  # None

z = Symbol("z", real=True)
(z+1).is_real  # True
(z+I).is_real  # False