Edited at

Sympyでsqrt(a**2)をaと表示する方法(a>0)

More than 1 year has passed since last update.


はじめに

SympyというPythonの代数計算ライブラリ(http://www.sympy.org/ )がある。Woflram社のMathematicaと類似の計算を行うことが可能である。

このソフトウェアの関数のなかに、sqrt()という1/2乗を計算する関数があるのだが、素朴にsqrt(a**2)を打ち込むと

In [1]: import sympy

In [2]: from sympy import *
In [3]: a = symbols("a")
In [4]: sqrt(a**2)
Out[4]: sqrt(a**2)

と打ち込むと、根号がとれない。$a$の符号について事前知識があれば、とってほしい。それを行う方法についてのメモである。


環境について


  • Python


    • Python 3.6.2



  • Sympy


    • 1.1.1




Sympyでsqrt(a**2)をaと表示する方法(a>0)

「はじめに」にも書いたように$a$の符号に関する事前知識がないために根号がとれない。ドキュメントを読むと下記のように書いてある。つまり、少なくとも以下の3通りの方法がある。


  • 事前にシンボルに符号を指定しておく

  • powdenest()を使用して無理やり根号を外す

以下のドキュメント見れば終わりという感じもするが、せっかくなので日本語で書いておく。


Note that sqrt(x**2) does not simplify to x.

>> sqrt(x**2)

sqrt(x**2)

This is because the two are not equal to each other in general.

For example, consider x == -1:

>> from sympy import Eq

>> Eq(sqrt(x**2), x).subs(x, -1)
False

This is because sqrt computes the principal square root, so the square may

put the argument in a different branch. This identity does hold if x is

positive:

>> y = Symbol('y', positive=True)

>> sqrt(y**2)
y

You can force this simplification by using the powdenest() function with

the force option set to True:

>> from sympy import powdenest

>> sqrt(x**2)
sqrt(x**2)
>> powdenest(sqrt(x**2), force=True)
x


事前に符号を指定しておく方法

sqrtの中に入れる記号の符号を事前に指定する方法である。このためには、記号定義を行う際にpositive=Trueとして正とするか、negative=Trueとして負とする。

In [6]: a = symbols("a", positive=True)

In [7]: sqrt(a**2)
Out[7]: a

In [8]: a = symbols("a", negative=True)
In [9]: sqrt(a**2)
Out[9]: -a

たしかに根号がとれる。


powdenest()を使用する方法

次に少し危険そうな方法として、無理やり外す方法がある。

In [14]: a = symbols("a")

In [15]: powdenest(sqrt(a**2),force=True)
Out[15]: a

確かにあたかも$a>0$であるかのようにとれる。しかし、

In [19]: powdenest(sqrt(a**2),force=True).subs([(a,-1)])

Out[19]: -1

となってしまうので注意が必要である。