独立した記事にするにもなあと思ったsympyの情報

sqrt(x**2) = x (x > 0) とか

既に言及している記事があるように, assumptionを指定すれば, よしなにしてくれる.

>>> from sympy import symbols, sqrt
>>> from sympy.abc import x
>>> sqrt(x**2)
sqrt(x**2)
>>> y = symbols('y', positive=True)
>>> sqrt(y**2)
y

それ以外にも sympy.assumptions.refine.refine を使う方法もある.
こちらの方が自由度が高くて便利そう.

>>> from sympy import refine, sqrt, Q
>>> from sympy.abc import x
>>> refine(sqrt(x**2), Q.real(x))
Abs(x)
>>> refine(sqrt(x**2), Q.positive(x))
x
>>> from sympy import refine, Q
>>> from sympy.abc import x
>>> refine((-1)**x, Q.real(x))
(-1)**x
>>> refine((-1)**x, Q.even(x))
1
>>> refine((-1)**x, Q.odd(x))
-1

無理数の範囲での因数分解

sympy.polys.polytools.factorを見る限り整数(domain='ZZ')と有理数(domain='QQ'), 有理数係数の複素数?(gaussian=True)しかできない.

>>> from sympy import sqrt, factor, solveset
>>> from sympy.abc import x
>>> factor(x**2 - 5, extension=solveset(x**2 - 5).args[0])
(x - sqrt(5))*(x + sqrt(5))

ということは出来ないこともないが, 意味や実用性は多分ない.

分数を期待しても小数が来る

SymPy Tutorial > Two Final Notes: ^ and /

分数を期待して/を書いても右辺左辺共にintfloatだと分数になりません.

>>> from sympy import Rational
>>> 1/2
0.5
>>> Rational(1, 2)
1/2

typeを見るとなんとなくわかるかも

>>> from sympy import S, Rational
>>> type(1/2)
float
>>> type(Rational(1, 2))
sympy.core.numbers.Half
>>> type(S('1/2'))
sympy.core.numbers.Half
>>> type(S(1)/2)
sympy.core.numbers.Half
>>> type(1/S(2))
sympy.core.numbers.Half

思いついたら追記します.

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.