2016-04-06 24 views
1

Yakın bir zaman önce Sympy kullanmaya başladım ve başlangıçtan beri bakış açımdan garip davranıyor. Bir değişkenden iki polinom, fx ve tn_shifted göz önünde bulundurun. Polinom p2 almak için diğerinden çıkardım. Daha sonra basitleştirmeyi ve aşağıda gösterildiği gibi tamamen farklı bir ifade alıyorum. İşte Semptom mantığı sadeleştirin

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) 

bir çıkıştır: İşte Yani pip show sympy bilgi

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 

olduğunu

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 piton 3.5 için Kobrayla gelir OS X Yosemite altında, bir hata ya da Sympy yoktur İfadeyi basitleştirdiğinde bazı mantık dışı mantıklara sahiptir?

cevap

2

Hata yok. Son üç ifadeyi basitleştirirseniz, hepsinin iptalini görürsünüz. Eğer (x - 2)**3 terim genişletmek için o zorlamak kez

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

, her şey yoluna girer. Neden olsa bu oluyor? Başlangıçta, doğal olarak Yani

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

sahip

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

Eğer fx itibaren, bu güzel iptal etmek şeyi neden olduğunu çıkarma

. Ancak p2_simplified için, sen

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

döndüren izolasyon, içinde p2_ethalon basitleştirmek için sormak sen tn_shifted bu eklerken Buradaki sorun, sympy tn_shifted gelen kübik genişleterek bu izin vereceğini fark etmez ki Daha da basitleştirmek için her şey, böylece daha karmaşık bir ifade olarak limbo kalırlar. Eğer tn_shifted gelen kübik genişletmek olsaydı

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

Ancak, yukarıda fx için basitleştirmek olur.

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

Alt satırda, sympy agresif bir ifadeyle en yeni terim eklenir her zaman basitleştirmek vermez vb çıkarılır Ve daha büyük görmek için sonradan sympy önleyebilir izolasyon bir ifadenin bir bölümünü basitleştirilmesi, çarpılır Daha genel bir sadeleştirmeye yol açacak desen.

Birkaç kez Maple ile benzer bir deneyim yaşadım, burada istediğim formüle bir formül getirmek için, basitleştirmek (toplama (expand (expr))) gibi işlevleri yerleştirmek zorunda kaldım.