【问题标题】:How to check if a SymPy expression has analytical integral如何检查 SymPy 表达式是否具有解析积分
【发布时间】:2018-04-26 09:16:31
【问题描述】:

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

例如,如果我尝试:

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

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

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

附:我也问过这个问题here on Reddit

【问题讨论】:

  • 能否将代码粘贴为text instead of screenshots? (生成的图像形式的表达式很好。)
  • @kazemakase 当然。实际上,图像的上半部分并不相关。这就是为什么我只放一张图片。
  • 感谢您的更新。这是一件方便的事情——如果人们可以轻松地复制和粘贴您的代码,他们更有可能写出答案。对我来说这是最重要的原因:)
  • 如果你真的想要,我可以这样做......但@bro 指出,一旦表达式变得更加复杂,这种方法就不起作用。它甚至不适用于integrate(2/cos(x**3), x),因为它将乘法排除在外,因此最外面的操作是乘法而不是积分。我认为他/她的回答是正确的。仍然要我(暂时)取消删除我的错误答案吗? :)
  • result = sp.integrate(1 / sp.cos(x**3)) ; isinstance(result, sp.Integral) ... 那个?

标签: python sympy symbolic-math integral


【解决方案1】:

“符号”解决方案始终存在:我刚刚发明了一个新函数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 或 Bessel 函数之类的东西可能没问题;只要它是一些“已知”的功能(这当然是一个模糊的术语)。问题变成了:如何判断 SymPy 是否能够集成特定的表达式?使用.has(Integral) 检查:

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

(不是isinstance(Integral),因为返回值可以像这里一样,2*Integral(1/cos(x**2), x)。)除了 SymPy 未能找到反导数之外,这并不能证明任何事情。反导数很可能是已知函数,甚至是基本函数。

【讨论】:

  • 好吧,@bro 和 @kazemakase 今天终于有时间做一些实验并测试您建议的不同方法。您可以在this notebook on GitHub 中看到它们。看来.has(Integral) 是正确答案,虽然速度很慢,击败the whole purpose! @kazemakase 方法在大多数情况下都可以,除非不是。例如2/cos(x**2) 失败。
  • @Foad 如果您需要集成快速退出而不是长时间尝试各种方法,请使用risch=True选项。
  • 那么它会像没有risch=True 选项时一样准确吗?这就是您的第一种方法速度快但在大多数情况下失败的原因吗?
  • 只使用 Risch 算法意味着两件事:(1)将评估更少的积分; (2) integrate 会更快返回。这是否是您应该做出的权衡取决于您的具体任务。
  • 在没有risch=True 选项的情况下再次运行实验表明您的两种方法都运行良好。非常感谢。我不知道它第一次做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2023-02-01
  • 2023-03-28
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
相关资源
最近更新 更多