つれづれなる備忘録

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

SymPyの使い方22 ~ 積分変換

 今回はSymPyを用いてフーリエ変換など積分変換する方法について紹介したい。

atatat.hatenablog.com

1. フーリエ変換

 積分変換として以下のフーリエ変換を実行するにはfourier_transform(関数,x,k)を用いる。

\displaystyle F(k)=\int_{-\infty}^{\infty} f(x) e^{-2i\pi x k} dx

フーリエ変換に用いる変数をシンボリックで定義したうえで、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を用いればよい。

\displaystyle f(x)=\int_{-\infty}^{\infty} f(k) e^{2i\pi x k} dk

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で実行することができる。

\displaystyle F(k)=\sqrt{\frac{2}{\pi}} \int_{0}^{\infty} f(k) \sin ({2i\pi x k} ) dk

\displaystyle F(k)=\sqrt{\frac{2}{\pi}} \int_{0}^{\infty} f(k) \cos ({2i\pi x k} ) dk

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を用いて実行できる。

\displaystyle F(s)=\int_{0}^{\infty} f(t) e^{-st} ds

(t,s)=symbols('t,s')
laplace_transform(t**a, t, s)
>(s**(-a)*gamma(a + 1)/s, 0, re(a) > -1)

ラプラス逆変換はinverse_laplace_transformを用いる。

\displaystyle f(t)=\frac{1}{2\pi i}\int_{c- i \infty}^{c+ i \infty} F(s) e^{st} dt

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変換といった積分変換も実行することができる。