为什么sympy count_ops()对集成的结果失败?

时间:2018-06-19 11:27:24

标签: sympy

我使用sympy的count_opt作为估算antiderivative返回的integrate的大小(叶数)的一种方法。

http://docs.sympy.org/latest/modules/core.html

Mathematica graphics

我发现它在某些表达式上失败。在

上使用的是sympy 1.1.1
   Python 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56) 
   [GCC 7.2.0] on linux

这是一个例子

from sympy import *
x,n,a = symbols('x n a')
integrand = x**n*log(a*x)
anti= integrate(integrand,x)
count_ops(anti)

现在

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/anaconda/lib/python3.6/site-packages/sympy/core/function.py", 
    line 2473, in count_ops
    if a.is_Rational:
AttributeError: 'NoneType' object has no attribute 'is_Rational'

它不喜欢这个结果的东西

>>> anti
Piecewise((None, Eq(n, -1)), (n*x*x**n*log(a)/(n**2 + 2*n + 1) + 
  n*x*x**n*log(x)/(n**2 + 2*n + 1) + x*x**n*log(a)/(n**2 + 2*n + 1) + 
  x*x**n*log(x)/(n**2 + 2*n + 1) - x*x**n/(n**2 + 2*n + 1), True))

这是一个已知问题吗?为什么会发生?这是错误吗?我应该举报吗?怎么样?

上面是在Linux Manjaro 17.1 XFCE上

1 个答案:

答案 0 :(得分:1)

函数count_ops不会看到None,有时会出现在Piecewise对象中。我会说这是一个错误。已经是reported on SymPy issue tracker

一种解决方法是将conds='none'传递给integrate,这将导致它忽略特殊情况n = -1并返回单个表达式

n*x*x**n*log(a)/(n**2 + 2*n + 1) + n*x*x**n*log(x)/(n**2 + 2*n + 1) + x*x**n*log(a)/(n**2 + 2*n + 1) + x*x**n*log(x)/(n**2 + 2*n + 1) - x*x**n/(n**2 + 2*n + 1)

然后count_ops正常工作。

anti = integrate(integrand, x, conds='none')
count_ops(anti)   # 49