SymPyの使い方5 ~ 数式の簡素化3
今回は簡単化の最後としてSymPyを用いた特殊関数の簡素化・展開するための方法を中心に紹介したい。
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. 特殊関数の簡素化
特殊関数の簡素化を行うには、それぞれ専用のコマンドを利用する。以下に簡素化の例を示す。
factorial
やbinomial
に対しては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を用いた特殊関数の簡素化・展開するコマンドについて紹介した。今回で数式の簡単化については一応終わりにする。