LoginSignup
5

More than 5 years have passed since last update.

sympyあるある

Posted at

独立した記事にするにもなあと思った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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5