つれづれなる備忘録

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

SymPyの使い方5 ~ 数式の簡素化3

 今回は簡単化の最後としてSymPyを用いた特殊関数の簡素化・展開するための方法を中心に紹介したい。

atatat.hatenablog.com

1. 特殊関数の展開

 expand_func()を用いるとガンマ関数や2項関数をいくつか展開してくれる。例えばガンマ関数gamma(x)

expand_func(gamma(x+3))
>x*(x + 1)*(x + 2)*gamma(x)

また2項関数binomial(n,k)

expand_func(binomial(n,3))
>n*(n - 2)*(n - 1)/6

2. 関数の書き換え

 ある関数を別の関数で表現する方法として.rewrite()がある。()内にsympyの関数名を入れてfunc1.rewrite(func2)という形で使用する。 例えば

tan(x).rewrite(sin)
>2*sin(x)**2/sin(2*x)
(cos(x)).rewrite(sin)
>sin(x + pi/2)

.rewrite()は特殊関数にも適用できる。

factorial(x).rewrite(gamma)
>gamma(x + 1)

別の関数で表現できない場合は、そのまま出力される。

gamma(x).rewrite(sin)
>gamma(x)

3. 特殊関数の簡素化

 特殊関数の簡素化を行うには、それぞれ専用のコマンドを利用する。以下に簡素化の例を示す。

factorialbinomialに対してはcombsimp()を用いる。

n, k = symbols('n k', integer = True)
>combsimp(binomial(n+2,k)/binomial(n,k))

ガンマ関数についてはgammasimp()を用いる。なおgoogle colabのSymPyのバージョンは1.1.1なのでサポートされておらず1.6.2にアップグレードする必要がある。

gammasimp(gamma(x)*gamma(1-x))
sin(pi*x)/pi

同様にデルタ関数についてはkrobecjersimp()を用いる。

from sympy.abc import i, j
 kroneckersimp( 1+KroneckerDelta(0, j) * KroneckerDelta(1, j))
>1

ベッセル関数についてはbesselsimp()を用いる

from sympy.abc import z, nu
besselsimp(besselj(nu, z*polar_lift(-1)))
>exp(I*pi*nu)*besselj(nu, z)

besselsimp(z*besseli(0, z) + z*(besseli(2, z))/2 + besseli(1, z))
>3*z*besseli(0, z)/2

超幾何関数に関してはhypersimp()を用いる。

hypersimp(factorial(n)**2 / factorial(2*n), n)
> (1+n)/2/(1+2*n)

4. まとめ

 今回はSymPyを用いた特殊関数の簡素化・展開するコマンドについて紹介した。今回で数式の簡単化については一応終わりにする。