Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 辛简化逻辑_Python_Sympy_Simplify_Polynomials - Fatal编程技术网

Python 辛简化逻辑

Python 辛简化逻辑,python,sympy,simplify,polynomials,Python,Sympy,Simplify,Polynomials,我最近开始使用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_shi

我最近开始使用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)
以下是一个输出:

0
0.25*x**3 - 1.5*x**2 + 3.0*x - 0.25*(x - 2)**3 - 2.0
0.25*x**3 - 1.5*x**2 + 3.0*x - 0.25*(x - 2)**3 - 2.0
0.25*x**3 - 1.5*x**2 + 3.0*x - 0.25*(x - 2)**3 - 2.0
Sympy在OS X Yosemite下为python 3.5提供了anaconda 这里是
pip show sympy
info

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

那么,当Sympy简化表达式时,它是否存在bug或有一些重要的逻辑?

没有bug。如果简化最后三个表达式,您将看到它们都被抵消了

>>> print(fx - p2_simplified - tn_shifted)
0.25*x**3 - 1.5*x**2 + 3.0*x - 0.25*(x - 2)**3 - 2.0
>>> print((fx - p2_simplified - tn_shifted).simplify())
0
一旦你迫使
(x-2)**3
术语展开,一切都会解决。为什么会发生这种情况?最初,你有

>>> fx
x**3 - 2*x**2 + x + 1
>>> tn_shifted
-0.75*x + 0.25*(x - 2)**3 + 1.5
>>> p2_ethalon
x**3 - 2*x**2 + 1.75*x - 0.25*(x - 2)**3 - 0.5
所以自然,

>>> p2_ethalon + tn_shifted
x**3 - 2*x**2 + 1.0*x + 1.0
当你从fx
fx
中减去它时,一切都会很好地抵消掉。但是,对于
p2\u simplified
,您要求它单独简化
p2\u ethalon
,然后返回

>>> p2_simplified
0.75*x**3 - 0.5*x**2 - 1.25*x + 1.5
这里的问题是,当你将它添加到
tn_shifted
中时,sympy没有意识到,通过从
tn_shifted
展开立方体,它将使一切变得更加简单,因此它们作为一个更复杂的表达式处于不确定状态

>>> p2_simplified + tn_shifted
0.75*x**3 - 0.5*x**2 - 2.0*x + 0.25*(x - 2)**3 + 3.0
但是,如果将立方从
tn\u移位
展开,则上述操作将简化为
fx

>>> tn_expanded = tn_shifted.expand()
>>> p2_simplified + tn_expanded
1.0*x**3 - 2.0*x**2 + 1.0*x + 1.0
总之,Symphy不会在每次添加、乘以、减去一个新项时都积极简化表达式。单独简化表达式的一部分可能会阻止Symphy以后看到更大的模式,从而导致更全局的简化

我曾经有过几次类似的使用Maple的经历,为了使公式符合我的要求,我必须嵌套一些函数,比如simplify(collect(expand(expr)))