2016-04-06 203 views
1

我最近開始使用Sympy,並從一開始就表現出奇怪的從我的觀點。Sympy簡化邏輯

考慮兩個多項式,fx和tn_shifted的一個變量。我從另一箇中減去一個來得到多項式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帶有蟒蛇爲Python 3.5下運行OS X Yosemite 這裏是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: [email protected] 
License: BSD 
Location: /Users/cnst/anaconda/lib/python3.5/site-packages 

那麼,有沒有錯誤或Sympy在簡化表達式時有一些不平凡的邏輯嗎?

回答

2

沒有錯誤。如果你簡化了最後三個表達式,你會看到它們全部取消。

>>> 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,它使一切都很好地抵消。然而,對於p2_simplified,你問它簡化隔離,返回

>>> p2_simplified 
0.75*x**3 - 0.5*x**2 - 1.25*x + 1.5 

p2_ethalon這裏的問題是,當您添加到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_shifted擴大立方,上面會簡化爲fx

>>> tn_expanded = tn_shifted.expand() 
>>> p2_simplified + tn_expanded 
1.0*x**3 - 2.0*x**2 + 1.0*x + 1.0 

底線,sympy不積極每次添加新的術語時簡化的表達式,相乘,相減,等,並簡化了隔離可以防止sympy以後的表達式的一部分看到更大的這將導致更全面的簡化。

我已經有過類似Maple的經歷幾次,爲了給我想要的確切形式帶來一個公式,我不得不嵌套函數像simplify(collect(expand(expr)))。