我使用sympy的count_opt
作为估算antiderivative
返回的integrate
的大小(叶数)的一种方法。
http://docs.sympy.org/latest/modules/core.html
我发现它在某些表达式上失败。在
上使用的是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上
答案 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