为什么 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]
正在声明 x
和 n
的类型:
>>> 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.0 和 Python 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)
我正在尝试使用 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]
正在声明 x
和 n
的类型:
>>> 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.0 和 Python 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)