2016-04-06 11 views
1

最近、私はSympyを使い始めました。Sympy簡略化ロジック

1つの変数の2つの多項式fxとtn_shiftedを考えてみましょう。私は多項式p2を得るために別のものから1を引きます。次に、私はそれを簡略化し、以下に示すように完全に異なる表現を得る。ここで

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ヨセミテ 下のpython 3.5のアナコンダが付属していますので、バグやSympyが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 

があるさ表現を簡素化するときに重要な論理を持っていますか?

答えて

2

バグはありません。最後の3つの式を簡略化すると、それらはすべてキャンセルされます。

>>> 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用語を展開すると、すべて機能します。なぜこれは起こるのですか?最初に、あなたはので、当然、

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

あなたがfxから、それはすべてがうまく相殺するために引き起こすことを引くとき

>>> 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_simplifiedのために、あなたはここでの問題は、あなたがtn_shiftedにこれを追加するとき、sympyはtn_shiftedから立方を拡大することによって、それが可能になることを認識しないということである

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

を返す、単独でp2_ethalonを簡素化するためにそれを頼みますすべてをさらに簡素化するために、より複雑な表現としてlimboにとどまります。あなたはtn_shiftedから立方を拡大した場合

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

しかし、上記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を防ぐことができよりグローバルな簡素化につながるパターンを提供する。

メープルと似たような経験がありましたが、私が望んだフォームに数式を入れるために、単純化(collect(expand(expr)))のような関数をネストしなければなりませんでした。