独立した記事にするにもなあと思った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 /
分数を期待して/
を書いても右辺左辺共にint
やfloat
だと分数になりません.
>>> 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
思いついたら追記します.