SymPy 사용법¶
SymPy 라이브러리를 불러오고, 기호 변수를 선언한다. 출력을 LaTex 수식으로 나타내고, 맷플롯립 모듈을 불러온다.
from sympy import *
x, y, z, t = symbols('x y z t')
f, g, h = symbols('f, g, h', cls=Function)
init_printing()
%matplotlib inline
퓨리어 급수¶
주기가 $2 \pi$인 함수 $f(x)$를 퓨리어 급수로 나타내면
$$ f(x) = a_0 + \sum_{n=1}^{\infty} ( a_n \cos nx + b_n \sin nx ) $$
$$ \begin{eqnarray} a_0 &=& \frac 1 {2\pi} \int_{-\pi}^{\pi} f(x) dx \\ a_n &=& \frac 1 {\pi} \int_{-\pi}^{\pi} f(x) \cos nx dx \\ b_n &=& \frac 1 {\pi} \int_{-\pi}^{\pi} f(x) \sin nx dx \end{eqnarray} $$[예제] Heaviside 계단 함수를 퓨리어 급수로 표현하기
Heaviside(x)
plot( Heaviside(x) )
Heaviside 계단 함수를 $(-\pi,\pi) $ 구간의 주기 함수로서 퓨리어 급수를 전개한다.
fourier_series( Heaviside(x), (x,-pi,pi) )
처음 4개의 항을 취하여 그래프로 나타내보면
s = _
s.truncate(4)
plot( s.truncate(4), (x,-2*pi,2*pi) )
10개의 항을 취하면, 계단함수에 더욱 가까워진다.
plot( s.truncate(10), (x,-2*pi,2*pi) )
[예제] 함수 $f(x)=x$ 를 $(-\pi,\pi) $ 구간의 주기 함수로서 퓨리어 급수를 전개한다.
s = fourier_series( x, (x,-pi,pi) )
s
plot( s.truncate(10), (x,-2*pi,2*pi) )
퓨리어 변환¶
함수 $f(x)$ 의 퓨리어 변환 $\hat f(w)$는 다음과 같이 정의된다. [Kreyszig]
$$ \begin{eqnarray} \hat f(w) &=& \frac 1 {\sqrt{2\pi}} \int _{-\infty} ^{\infty} f(x) e ^{-i w x} dx \\ f(x) &=& \frac 1 {\sqrt{2\pi}} \int _{-\infty} ^{\infty} \hat f(w) e ^{iwx} dw \end{eqnarray} $$SymPy에서 퓨리어 변환 $F(k)$는 다음과 같이 정의된다. [Wikipedia]
$$ F(k) = \int _{-\infty} ^{\infty} f(x) e ^{-2\pi i k x} dx $$$$ f(x) = \int _{-\infty} ^{\infty} F(k) e ^{2\pi i k x} dk $$퓨리어 변환에 관한 표현들이 서로 조금 다름에 유의하고, 두 정의를 비교하면 다음과 같다.
$$ w = 2 \pi k $$$$ \hat f(w) = \frac 1 {\sqrt{2\pi}} F(k) $$
k, w = symbols('k w')
a = Symbol('a', positive=True)
Gaussian 함수 $\,\, e^{-a x^2 } \,\, a>0$
Fk = fourier_transform( exp(-a*x**2), x, k )
Fk
퓨리어 변환 $ \hat f(w) $ 로 나타내면
fw = Fk.subs( k, w/(2*pi) ) / sqrt(2*pi)
fw
지수함수 (좌우대칭) $\,\, e^{-a |x| } \,\, a>0$
Fk = fourier_transform( exp(-a*abs(x)), x, k )
Fk
fw = Fk.subs( k, w/(2*pi) ) / sqrt(2*pi)
fw
지수함수 (양의 축) $\,\, e^{-a x } \theta (x) \,\,\, a>0, x>0$
Fk = fourier_transform( exp(-a*x)*Heaviside(x), x, k )
Fk
fw = Fk.subs( k, w/(2*pi) ) / sqrt(2*pi)
fw
델타함수 $\delta (x)$
Fk = fourier_transform( DiracDelta(x), x, k )
Fk
fw = Fk.subs( k, w/(2*pi) ) / sqrt(2*pi)
fw
fourier_transform( 1, x, k )
상수 1의 퓨리어 변환은 델타함수 $\delta (k)$이다.
SymPy에서 현재 지원되지 않고 있다.
[참고] 다른 형태의 표기법도 흔히 사용된다.
함수 $f(x)$ 의 퓨리어 변환은 다음과 같이 정의된다. [Boas]
$$ F (\alpha) = \frac 1 {2 \pi} \int _{-\infty} ^{\infty} f(x) e ^{-i \alpha x} dx $$$$ f(x) = \int _{-\infty} ^{\infty} F (\alpha) e ^{i \alpha x} d\alpha$$함수 $f(x)$ 의 퓨리어 변환은 다음과 같이 정의된다. [Arfken]
$$ \begin{eqnarray} g(\omega) &=& \frac 1 {\sqrt{2\pi}} \int _{-\infty} ^{\infty} f(x) e ^{i \omega x} dx \\ f(x) &=& \frac 1 {\sqrt{2\pi}} \int _{-\infty} ^{\infty} g(\omega) e ^{-i \omega x} d \omega \end{eqnarray} $$