gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:11:18 32 4
gpt4 key购买 nike

如何检查是否从 sympy 返回表达式 integrate命令仍然包含一个integrals.Integral 或? NonElementaryIntegral
我试图通过检查它是否仍然未评估来检查 sympy 的反导数是否成功

例如:

from sympy import *
x=symbols('x')
isinstance(Integral(x**2, x),integrals.Integral)

作品和退货 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)

这使
-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 而不是 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')))))"

所以我需要同时查找 IntegralNonElementaryIntegral .但到目前为止,我不知道如何检查 NonElementaryIntegral因为我不知道它应该在哪个类(class)。不是 integral.NonElementaryIntegral并且需要找到它住的地方。
any(isinstance(mx, integrals.NonElementaryIntegral) for mx in anti.args)


 error: module 'sympy.integrals.integrals' has no attribute 
'NonElementaryIntegral'

页面 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.

好的,但是如何检查呢?

最佳答案

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

关于sympy - 如何检查 sympy 表达式是否包含 Integral 或 NonElementaryIntegral 的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45155289/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com