给定一个表达式,我如何找到(如果需要,在简化后)该表达式是否包含复数I
,它是−1的平方根?
在Maple中,这是使用check has(expression,I)
完成的;请参阅其help page。
在Mathematica中,这是使用check If[FreeQ[expression, Complex]
来完成的,例如:How to check if expression contains a Complex expression?
但我不确定如何在SymPy中做类似的事情。
使用expression.is_complex
不会返回True
,即使表达式中包含I
。另外,由于real是complex的子集,因此无论如何这都不是一个正确的测试。
我需要检查是否有显式的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
这是在Maple中,供参考:
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中实现上述功能?
发布于 2019-12-22 18:34:49
has
检查表达式是否包含某些子表达式,如I
ex1.has(I) # True
sin(z).has(I) # False
(sin(z)+I).has(I) # True
请注意,这没有考虑到可能会去掉I
的简化。
对于像is_complex
这样的检查,它们会考虑输入变量的所有可能值,如果没有明确的答案(或者如果SymPy没有看到相关的简化),则返回None
。同样,在您的例子中,您希望使用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
https://stackoverflow.com/questions/59441790
复制相似问题