我最近开始使用Sympy,从一开始它就表现得很奇怪。在
考虑两个多项式,一个变量的fx和tn_位移。我从另一个中减去一个得到多项式p2。然后我对它进行简化,得到一个完全不同的表达式,如下所示。在
import sympy as spy
from sympy import Symbol
x = Symbol('x')
a, b = 1, 3
n = 3
tn = lambda x: x**3 - 3*x
fx = spy.simplify(x**3 - 2*x**2 + x + 1)
tn_shifted = (b - a)**n / (2**(2*n - 1)) * tn((2*x - (b + a)) / (b - a))
tn_shifted = spy.simplify(tn_shifted)
p2_ethalon = fx - tn_shifted
print(fx - p2_ethalon - tn_shifted)
p2_simplified = spy.simplify(fx - tn_shifted)
print(fx - p2_simplified - tn_shifted)
p2_expanded = spy.expand(fx - tn_shifted)
print(fx - p2_expanded - tn_shifted)
print(p2_ethalon - p2_simplified)
以下是输出:
^{pr2}$Sympy在OS X Yosemite下为Python3.5提供了anaconda
这是pip show sympy
信息
Name: sympy
Version: 0.7.6.1
Summary: Computer algebra system (CAS) in Python
Home-page: http://sympy.org
Author: SymPy development team
Author-email: sympy@googlegroups.com
License: BSD
Location: /Users/cnst/anaconda/lib/python3.5/site-packages
那么,有没有一个bug或者Sympy在简化表达式时有一些非平凡的逻辑呢?在
没有错误。如果你简化最后三个表达式,你会发现它们都被抵消了。在
一旦你强迫这个
^{pr2}$(x - 2)**3
项展开,一切都会成功。为什么会这样呢?最初,你有所以,自然
当您从
fx
中减去这个值时,它会使所有内容都很好地抵消掉。但是,对于p2_simplified
,您要求它单独简化p2_ethalon
,这将返回这里的问题是,当你把这个加到
tn_shifted
中时,辛普森没有意识到,通过从tn_shifted
展开立方,它将允许所有的事情变得更加简单,所以它们作为一个更复杂的表达式仍然没有定论。在但是,如果要从
tn_shifted
展开立方体,上面的内容将简化为fx
。在总之,sypy不会在每次添加、乘法、减法等操作时都积极地简化表达式。孤立地简化表达式的一部分可能会阻止sypy以后看到更大的模式,从而导致更全局的简化。在
我在Maple上也有过类似的经验,为了使公式达到我想要的格式,我不得不嵌套一些函数,比如simplify(collect(expand(expr)))。在
相关问题 更多 >
编程相关推荐