今回はSymPyを用いてフーリエ変換など積分変換する方法について紹介したい。
1. フーリエ変換
積分変換として以下のフーリエ変換を実行するにはfourier_transform(関数,x,k)
を用いる。
フーリエ変換に用いる変数をシンボリックで定義したうえで、fourier_transform
を用いることでシンボリックなフーリエ変換が実行できる。
from sympy import * init_printing(False) (x,k)=symbols('x,k') fourier_transform(exp(-x**2), x, k) >sqrt(pi)*exp(-pi**2*k**2)
以下のフーリエ逆変換ではinverse_fourier_transform
を用いればよい。
inverse_fourier_transform(sqrt(pi)*exp(-(pi*k)**2), k, x) >exp(-x**2)
積分結果が解析的に示せない場合はFourierTransform()
として返す。以下は1のフーリエ変換は、解析的に示せないがデルタ関数は実行できている。
fourier_transform(1, x, k) >FourierTransform(1, x, k) fourier_transform(DiracDelta(x), x, k) >1
sinc関数のフーリエ変換も実行できている。以下のPieswise関数は1/(4pi**2Abs(k*2)) > 1を満たせば(k<1/2pi) pi, それ以外は0を返す。
fourier_transform(sinc(x), x, k) >Piecewise((pi, 1/(4*pi**2*Abs(k**2)) > 1), (0, True))
フーリエ変換のほかに仲間のsinやcos変換もsin_transform
, cos_transform
で実行することができる。
a=symbols('a') sine_transform(x*exp(-a*x**2), x, k) >sqrt(2)*k*exp(-k**2/(4*a))/(4*a**(3/2)) cosine_transform(exp(-a*x), x, k) >sqrt(2)*a/(sqrt(pi)*(a**2 + k**2)
2. ラプラス変換
以下のラプラス変換はlaplace_transform
を用いて実行できる。
(t,s)=symbols('t,s') laplace_transform(t**a, t, s) >(s**(-a)*gamma(a + 1)/s, 0, re(a) > -1)
ラプラス逆変換はinverse_laplace_transform
を用いる。
inverse_laplace_transform(exp(-a*s)/s, s, t) >Heaviside(-a + t)
laplace_transform(DiracDelta(t), t, s) >(1 - Heaviside(0), -oo, True) laplace_transform(Heaviside(t), t, s) >(1/s, 0, True) laplace_transform(t*Heaviside(t), t, s) >(s**(-2), 0, True)
3. まとめ
SymPyでは今回紹介したフーリエ変換やラプラス変換の他、Mellin変換やHankel変換といった積分変換も実行することができる。