つれづれなる備忘録

日々の発見をあるがままに綴る

SymPyの使い方4 ~ 数式の簡素化2

 前回に続き今回もSymPyを用いて数式を特定の関数の性質を利用した簡素化・展開するための方法を中心に紹介したい。

atatat.hatenablog.com

1. 部分分数分解

 部分分数分解を実行するにはapart()を使用する。

expr=(3*x**2 - 2*x - 8)/(2*x**2 - 8*x)
apart(expr)
>3/2 + 4/(x - 4) + 1/x

多変数の場合は、部分分数に分解する変数を以下のように指定する。

apart(y/(x + 2)/(x + 1), x)
>-y/(x + 2) + y/(x + 1)

2. 三角関数の簡素化

 一般的な多項式を簡素化するためにはsimplif()を用いたがm三角関数を簡素化するためにはtrigsimp()を用いる。

以下のように基本的な三角関数の性質が反映される。

trigsimp(cos(x)**2+sin(x)**2)
>1

また、複雑な三角関数多項式も適度に簡素化してくれる。

trigsimp(cos(x)**4-2*cos(x)**2*sin(x)**2+sin(x)**4)
>cos(4*x)/2 + 1/2

三角関数だけでなく、双曲線関数に対しても適用できる。例えば、

trigsimp(cosh(x)**2 + sinh(x)**2)
>cosh(x)

三角関数を展開するコマンドとしてexpand_trig()があり、三角関数の加法定理を用いて展開する。

expand_trig(cos(x + y))
>-sin(x)*sin(y) + cos(x)*cos(y)

もちろんexpand_trig()で展開した式をtrigsimp()を用いると元の式に戻る。

trigsimp(-sin(x)*sin(y) + cos(x)*cos(y))
>cos(x + y)

3. べき乗の簡素化

 べき乗の式を簡素化するにはpowsimp()を用いる。べき乗の簡素化を行うには、変数を正や実数などより正確に以下のように定義する必要がある。

x, y = symbols('x y', positive=True)
a, b = symbols('a b', real=True)

powsim()はべき乗の肩の計算を簡素化する。

powsimp(x**a*y**a)
(x*y)**a
powsimp(x**a*x**b)
>x**(a + b)

べき乗の肩の部分を展開するにはexpand_power_exp()を用いる。

expand_power_exp((x*y)**a)
>(x*y)**a

2変数を展開する場合はexpand_power_base()

expand_power_base((x*y)**a)
>x**a*y**a

3変数を展開する場合はpowdenest()

powdenest((x**a)**b)
>x**(a*b)

4. 対数関数の簡素化

 対数関数の性質を利用した展開・簡素化を実行できる。まず対数関数の展開はexpand_log()を使用する。

expand_log(log(x*y))
>log(x) + log(y)
expand_log(log(x/y))
>log(x) - log(y)
expand_log(log(x**2))
>2*log(x)

展開とは逆にまとめる場合はlogcombine()を用いる。

logcombine(log(x) - log(y))
>log(x/y)
logcombine(2*log(x))
>log(x**2)

5. まとめ

 今回は部分分数分解、数式を三角関数、べき乗、対数関数の性質を利用した簡素化・展開する方法について紹介した。