2016-04-06 14 views
1

Ich habe vor kurzem beginnen, Sympy verwenden, und von Anfang an verhält es sich seltsam aus meiner Sicht.Sympy vereinfachen Logik

Betrachten Sie zwei Polynome, fx und tn_shifted von einer Variablen. Ich subtrahiere eins voneinander, um das Polynom p2 zu erhalten. Dann führe ich eine Vereinfachung durch und bekomme einen völlig anderen Ausdruck, wie unten gezeigt.

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) 

Hier ein Ausgang:

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 kommt mit anaconda für Python 3.5 unter OS X Yosemite Hier 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: [email protected] 
License: BSD 
Location: /Users/cnst/anaconda/lib/python3.5/site-packages 

So gibt es ein Bug oder Sympy hat etwas nichttriviale Logik, wenn es den Ausdruck vereinfacht?

Antwort

2

Es gibt keinen Fehler. Wenn Sie die letzten drei Ausdrücke vereinfachen, werden sie alle gelöscht.

>>> 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 

Sobald Sie erzwingen, dass (x - 2)**3 Begriff zu erweitern, alles funktioniert. Warum passiert das? Zunächst haben Sie

>>> 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 

So natürlich

>>> p2_ethalon + tn_shifted 
x**3 - 2*x**2 + 1.0*x + 1.0 

Wenn Sie subtrahieren, dass aus fx, es alles bewirkt schön aufzuheben. Doch für p2_simplified, können Sie es fragen p2_ethalon isoliert zu vereinfachen, die

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

Das Problem gibt, dass, wenn Sie dies tn_shifted hinzufügen, sympy nicht erkennen, dass die kubische aus tn_shifted durch die Erweiterung es erlauben würde, alles, um noch mehr zu vereinfachen, so bleiben sie in der Schwebe als ein komplexerer Ausdruck.

>>> p2_simplified + tn_shifted 
0.75*x**3 - 0.5*x**2 - 2.0*x + 0.25*(x - 2)**3 + 3.0 

Wenn Sie jedoch die kubische von tn_shifted zu erweitern, würde die oben fx vereinfachen.

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

Unterm Strich ist sympy nicht aggressiv einen folgenden Ausdruck jedes Mal, vereinfachen ein neuer Begriff hinzugefügt wird, multipliziert wird, subtrahiert, etc. Und ein Teil eines Ausdrucks in Isolation vereinfacht kann sympy verhindern später eine größere Ansicht zu erhalten Muster, das zu einer globaleren Vereinfachung führen würde.

Ich hatte eine ähnliche Erfahrung mit Maple ein paar Mal, wo, um eine Formel in die exakte Form zu bringen, die ich wollte, musste ich Funktionen wie vereinfachen (sammeln (erweitern (Ausdruck))).