如何检查sympy表达式是否包含Integral或NonElementaryIntegral的实例?

时间:2017-07-17 23:47:07

标签: sympy

如何检查从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'

好的,但是如何检查呢?

1 个答案:

答案 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)])