python - 为什么 SymPy 1.1.1 在计算这个基本积分时返回错误?

标签 python sympy symbolic-math calculus

我正在尝试使用 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]

Mathematica graphics

最佳答案

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

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

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

返回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 直接进入“手动”算法,得到相同的结果。

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

关于python - 为什么 SymPy 1.1.1 在计算这个基本积分时返回错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50903574/

相关文章:

python - 使用Python编程语言获取密码

python - 无法从 github 或 pip 安装 python 模块 aubio

python-3.x - Sympy TypeError - 无法将浮点对象解释为整数

matlab - mtaylor MuPAD - Matlab

matlab - 创建一个空的符号矩阵并在 Matlab 中预定义维度?

python - 将 python 变量传递给另一个脚本

python - SQLAlchemy中如何删除多个表

Python函数声明动态全局变量

python - sympy 中的积分不适用于 x*cos(n*pi*x/L),但适用于 sqrt(1.)*x*cos(n*pi*x/L)。请参阅下面的代码片段

matlab - 如何在 Matlab 上为符号表达式编写 `lhs()` 或 `rhs()` 函数