为什么 SymPy 1.1.1 return 在计算这个基本积分时出错?

Why does SymPy 1.1.1 return an error when computing this basic integral?

我正在尝试使用 SymPy 1.1.1 集成 x**(n-1)*sin(x**n)。知道为什么错误

TypeError: cannot determine truth value of Relational

生成了吗?这是一个已知的问题?这是一个错误吗?还是我做错了什么?

pip list | grep sympy
sympy                              1.1.1 

运行 在

cat /etc/*release
Manjaro Linux
DISTRIB_ID=ManjaroLinux
DISTRIB_RELEASE=17.1.10
DISTRIB_CODENAME=Hakoila
DISTRIB_DESCRIPTION="Manjaro Linux"
Manjaro Linux

使用最新的 Anaconda Python

$python
Python 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56) 
[GCC 7.2.0] on linux
>>> from sympy import *
>>> x, n=symbols('x n')
>>> integrate(x**(n-1)*sin(x**n),x)

给予

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/anaconda/lib/python3.6/site-packages/sympy/integrals/integrals.py", line 1295, in integrate
    risch=risch, manual=manual)
  File "/opt/anaconda/lib/python3.6/site-packages/sympy/integrals/integrals.py", line 486, in doit
    conds=conds)
  File "/opt/anaconda/lib/python3.6/site-packages/sympy/integrals/integrals.py", line 908, in _eval_integral
    h = meijerint_indefinite(g, x)
  File "/opt/anaconda/lib/python3.6/site-packages/sympy/integrals/meijerint.py", line 1612, in meijerint_indefinite
    res = _meijerint_indefinite_1(f.subs(x, x + a), x)
  File "/opt/anaconda/lib/python3.6/site-packages/sympy/integrals/meijerint.py", line 1675, in _meijerint_indefinite_1
    if b < 0 or f.subs(x, 0).has(nan, zoo):
  File "/opt/anaconda/lib/python3.6/site-packages/sympy/core/relational.py", line 195, in __nonzero__
    raise TypeError("cannot determine truth value of Relational")
TypeError: cannot determine truth value of Relational

使用 Mathematica 计算反导数,

ClearAll[x,n]
Integrate[x^(n-1) Sin[x^n],x]

正在声明 xn 的类型:

>>> from sympy import *
>>> x = Symbol('x',real=True)
>>> n = Symbol('n',integer=True)
>>> integrate(x**(n-1) * sin(x**n),x)
-cos(x**n)/n

分钟 integrate 到 return 反导数。但是,使用声明 x, n = symbols('x n') 代替,它也有效。我正在使用 SymPy 1.0Python 2.7.12.

SymPy 尝试了几种方法,大致按以下顺序:Risch 算法、Meijer G 积分、"manual integration"(基于微积分类型规则)和 Risch 的慢启发式形式。 Meijer G 在这里抛出一个错误,这是一个错误(考虑到 b < 0 的真值可能是未知的,if b < 0 应该被重写)。

作为解决方法,禁用 Meijer G 有助于:

x, n = symbols('x n')
integrate(x**(n-1)*sin(x**n), x, meijerg=False)

returns Piecewise((log(x)*sin(1), Eq(n, 0)), (-cos(x**n)/n, True)) 这比 Mathematica 输出更正确,认识到 n=0 的情况不同。

在 SymPy 的当前开发版本中,此输出被重新排序以将通用案例放在第一位:Piecewise((-cos(x**n)/n, Ne(n, 0)), (log(x)*sin(1), True))

也可以使用选项 manual=True 告诉 SymPy 直接进入 "manual" 算法,结果相同。

integrate(x**(n-1)*sin(x**n), x, manual=True)