如何在 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
给定一个表达式,如果表达式包含复数 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