如何检查SymPy表达式是否具有分析积分

时间:2018-04-26 09:16:31

标签: python sympy symbolic-math integral

我想解决我的另一个问题here,所以每当没有分析/符号解决方案和积分时,我都需要同意回复错误。

例如,如果我尝试:

from sympy import *
init_printing(use_unicode=False, wrap_line=False, no_global=True)
x = Symbol('x')
integrate(1/cos(x**2), x)

只是[漂亮]打印积分本身

enter image description here

没有解决和/或给出错误无法解决它!

P.S。我也问了这个问题here on Reddit

1 个答案:

答案 0 :(得分:3)

A"符号"解决方案始终存在:我刚刚发明了一个新函数intcos(x),根据定义它是1/cos(x**2)的反导数。现在这个积分有一个象征性的解决方案!

对于要严格回答的问题,必须限制答案中允许的功能类别。通常会考虑elementary functions。正如SymPy integral reference所解释的那样,它采用的Risch算法可以证明某些函数没有基本的反衍生物。使用选项risch=True并检查返回值是否为sympy.integrals.risch.NonElementaryIntegral

的实例
from sympy.integrals.risch import NonElementaryIntegral
isinstance(integrate(1/exp(x**2), x, risch=True), NonElementaryIntegral)  # True

然而,由于Risch算法实现不完整,在许多情况下像1/cos(x**2)它返回一个普通的Integral对象。这意味着它无法找到基本的反衍生物或证明一个不存在。

对于这个例子,它有助于用rewrite(cos, exp)以指数形式重写三角函数:

isinstance(integrate((1/cos(x**2)).rewrite(cos, exp), x, risch=True), NonElementaryIntegral)  

返回True,因此我们知道积分是非小数的。

非基本抗衍生物

但通常我们并不真正需要基本功能;像Gamma或erf或贝塞尔函数这样的东西可能没问题;只要它有一些"已知"功能(当然是一个模糊的术语)。问题变成:如何判断SymPy是否能够集成特定表达式?使用.has(Integral)检查:

integrate(2/cos(x**2), x).has(Integral)   # True

(不是isinstance(Integral),因为返回值可以像2*Integral(1/cos(x**2), x)一样。)这不会证明除SymPy之外的其他任何内容都无法找到反导。反衍生物可能是一种已知的功能,甚至是基本的功能。