如何检查从sympy index.html
命令返回的表达式是否仍包含integrals.Integral 或的实例? integrate
我试图检查来自同情的反衍生物,看它是否成功,通过检查它是否仍未评估
例如:
NonElementaryIntegral
工作并返回from sympy import *
x=symbols('x')
isinstance(Integral(x**2, x),integrals.Integral)
。但是如果表达式在其他表达式中有一个实例True
,那么如何检查?
我需要一种方法来查看表达式树,看看其中是否至少存在Integral
的一个实例,并返回True。我不知道如何迭代它并在此时执行此操作。
我尝试了以下内容(我非常喜欢Python和sympy)。
integrals.Integral
给出了
from sympy import *
x=symbols('x')
expr=integrate((-x**2+2)*exp(x/(x**2+2))/(x**3+2*x),x)
但这给了-Integral(-2*exp(x/(x**2 + 2))/(x**3 + 2*x), x) -
Integral(x**2*exp(x/(x**2 + 2))/(x**3 + 2*x), x)
expr.args #which is tuple
(-Integral(-2*exp(x/(x**2 + 2))/(x**3 + 2*x), x), -
Integral(x**2*exp(x/(x**2 + 2))/(x**3 + 2*x), x))
any(isinstance(m, integrals.Integral) for m in expr.args)
,为什么?
我也试过
False
而且这个消息
for m in expr.args:
isinstance(m, integrals.Integral)
我期待两者都是真的。
如何检查表达式是否包含至少 False
False
的任何一个实例?
更新
好的,发现了什么。上面的积分实际上是integrals.Integral
而不是NonElementaryIntegral
。查看expr的表达式树
Integral
所以我需要同时寻找srepr(expr)
"Add(Mul(Integer(-1), NonElementaryIntegral(Mul(Integer(-1), Integer(2),
Pow(Add(Pow(Symbol('x'), Integer(3)), Mul(Integer(2), Symbol('x'))),
Integer(-1)), exp(Mul(Symbol('x'), Pow(Add(Pow(Symbol('x'), Integer(2)),
Integer(2)), Integer(-1))))), Tuple(Symbol('x')))), Mul(Integer(-1),
NonElementaryIntegral(Mul(Pow(Symbol('x'), Integer(2)),
Pow(Add(Pow(Symbol('x'), Integer(3)), Mul(Integer(2), Symbol('x'))),
Integer(-1)), exp(Mul(Symbol('x'), Pow(Add(Pow(Symbol('x'), Integer(2)),
Integer(2)), Integer(-1))))), Tuple(Symbol('x')))))"
和Integral
。但到目前为止,我不知道如何检查NonElementaryIntegral
,因为我不知道它应该在哪个类中。它不是NonElementaryIntegral
,需要找到它的居住地。
integral.NonElementaryIntegral
给出
any(isinstance(mx, integrals.NonElementaryIntegral) for mx in anti.args)
页面http://docs.sympy.org/latest/modules/integrals/integrals.html仅显示
error: module 'sympy.integrals.integrals' has no attribute
'NonElementaryIntegral'
好的,但是如何检查呢?
答案 0 :(得分:2)
expr.has(Integral)
这样做。 NonElementaryIntegral inherits from Integral类,因此根据inheritance rules,只需检查Integral
。
一个自包含的例子是
from sympy import *
x = symbols('x')
expr = integrate(exp(x**4)/(x**2+1), x)
print(expr.has(Integral))
您可以使用
找到有关班级名称的详细信息print([type(a) for a in preorder_traversal(expr)])