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

Nas*_*ser 4 sympy

如何检查从 sympyintegrate命令返回的表达式是否仍包含积分的实例。IntegralNonElementaryIntegral

我正在尝试检查 sympy 的反导数,看看它是否成功,通过检查它是否仍然未评估

例如:

from sympy import *
x=symbols('x')
isinstance(Integral(x**2, x),integrals.Integral)
Run Code Online (Sandbox Code Playgroud)

工作并回报True。但是如果表达式Integral在其他表达式中有一个实例,如何检查?

我需要一种方法来查看表达式树并查看integrals.Integral其中是否至少存在一个实例,然后返回 True。我现在不知道如何迭代它并执行此操作。

我尝试了以下方法(我是Python和sympy的新手)。

from sympy import *
x=symbols('x')
expr=integrate((-x**2+2)*exp(x/(x**2+2))/(x**3+2*x),x)
Run Code Online (Sandbox Code Playgroud)

这使

-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)
Run Code Online (Sandbox Code Playgroud)

但这给了False,为什么呢?

我也尝试过

for m in expr.args:
    isinstance(m, integrals.Integral)
Run Code Online (Sandbox Code Playgroud)

这给了

False
False
Run Code Online (Sandbox Code Playgroud)

我原以为两者都是真的。

如何检查表达式中是否至少integrals.Integral包含一个where的实例?

更新 好吧,发现了一些东西。上面的积分实际上是NonElementaryIntegral ,而不是Integral。查看expr的表达式树

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')))))"
Run Code Online (Sandbox Code Playgroud)

所以我需要寻找IntegralNonElementaryIntegral。但到目前为止,我不知道如何检查,NonElementaryIntegral因为我不知道它应该属于哪个类别。它不是 integral.NonElementaryIntegral也需要找到它居住的地方。

any(isinstance(mx, integrals.NonElementaryIntegral) for mx in anti.args)
Run Code Online (Sandbox Code Playgroud)

给出

 error: module 'sympy.integrals.integrals' has no attribute 
        'NonElementaryIntegral'
Run Code Online (Sandbox Code Playgroud)

该页面http://docs.sympy.org/latest/modules/integrals/integrals.html仅说明

If the indefinite Integral returned by this function is an instance of 
NonElementaryIntegral, that means that the Risch algorithm has proven that 
integral to be non-elementary. 
Run Code Online (Sandbox Code Playgroud)

好的,但是如何检查呢?

小智 5

expr.has(Integral)
Run Code Online (Sandbox Code Playgroud)

做这个。类 NonElementaryIntegral继承自 Integral,因此根据继承规则,检查Integral.

一个独立的例子是

from sympy import *
x = symbols('x')
expr = integrate(exp(x**4)/(x**2+1), x)
print(expr.has(Integral))
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令找到有关类名称的详细信息

print([type(a) for a in preorder_traversal(expr)])
Run Code Online (Sandbox Code Playgroud)