首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在SymPy中查找表达式中是否包含复数i?

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

Stack Overflow用户
提问于 2019-12-22 13:18:26
回答 1查看 181关注 0票数 1

给定一个表达式,我如何找到(如果需要,在简化后)该表达式是否包含复数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。

代码语言:javascript
运行
复制
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中,供参考:

代码语言:javascript
运行
复制
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中实现上述功能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-22 18:34:49

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

代码语言:javascript
运行
复制
ex1.has(I)        # True
sin(z).has(I)     # False
(sin(z)+I).has(I) # True

请注意,这没有考虑到可能会去掉I的简化。

对于像is_complex这样的检查,它们会考虑输入变量的所有可能值,如果没有明确的答案(或者如果SymPy没有看到相关的简化),则返回None。同样,在您的例子中,您希望使用is_real (正如您所提到的,实数在SymPy的意义上也是复数)。为了进行说明,请考虑以下内容:

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59441790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档