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

How to check if a SymPy expression has analytical integral

我想解决我的另一个问题 here 所以我需要同情 return 当没有 analytical/symbolic 和积分的解决方案时出现错误。

例如,如果我尝试:

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

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

没有解决and/or报错无法解决!

P.S。这个问题我也问过.

一个"symbolic"解总是存在的:我刚刚发明了一个新函数intcos(x),根据定义它是1/cos(x**2)的反导数。现在这个积分有一个符号解!

为了严格回答问题,必须限制答案中允许的 class 函数。通常认为 elementary functions. As SymPy integral reference 解释说,它使用的 Risch 算法可以 证明 一些函数没有初等反导数。使用选项 risch=True 并检查 return 值是否是 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) 它 return 是一个普通的 Integral 对象。这意味着它无法找到基本的反导数或证明它不存在。

对于这个例子,它有助于根据指数重写三角函数,rewrite(cos, exp)

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

returns 是的,所以我们知道积分是非初等的。

非初等反导数

但通常我们并不真正需要初等函数; Gamma 或 erf 或 Bessel 函数之类的东西可能没问题;只要它是一些 "known" 函数(这当然是一个模糊术语)。问题变成了:如何判断 SymPy 是否能够集成特定的表达式?使用 .has(Integral) 检查:

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

(不是 isinstance(Integral),因为 return 值可以是 2*Integral(1/cos(x**2), x)。)这不会 证明 除了SymPy 未能找到反导数。反导数很可能是已知函数,甚至是初等函数。