モジュールの import
In [1]:
from sympy.abc import *
from sympy import *
# SymPy Plotting Backends (SPB)
from spb import *
# グラフを SVG で Notebook にインライン表示
%config InlineBackend.figure_formats = ['svg']
init_printing();
mathtext.fontset の設定
In [2]:
# グラフを描くためではなくデフォルト設定のため
import matplotlib.pyplot as plt
plt.rcParams['mathtext.fontset'] = 'cm'
関数の定義
区間 $[-1: 1]$ で定義された関数 $f(x) = 1 – |x|$ が区間外では周期 $2$ の周期関数だとして,そのフーリエ級数展開を求める。
In [3]:
# -1 <= x <= 1 で定義された関数 f0(x)
def f0(x):
return 1 - abs(x)
# f0(x) を任意周期 2 の周期関数にする小道具
def xcyc(x):
return x - 2*floor((x+1)/2)
# 周期 2 の周期関数 f(x)
def f(x):
return f0(xcyc(x))
関数のグラフ
区間 $-1 \le x \le 1$ で定義された関数 $f_0(x)$ と,周期 $2$ の周期関数 $f(x)$ をそれぞれグラフにしてみる。
In [4]:
plot(f0(x), (x, -1, 1), xlim=(-5, 5), ylabel="$f_0(x)$");
In [5]:
# plot(f(x), (x, -5, 5)) とするところだが
# plot(f, (x, -5, 5)) とすると警告が出ない。
plot(f, (x, -5, 5), xlim=(-5, 5), ylabel="$f(x)$");
フーリエ級数の定義
定義どおりにフーリエ級数展開を定義すると以下のようになる。
In [6]:
var('n', integer = True)
def a(n):
return integrate(f0(x)*cos(n*pi*x), (x, -1, 1))
def b(n):
return integrate(f0(x)*sin(n*pi*x), (x, -1, 1))
def Fourier(n):
sums = a(0)/2 + summation(
a(i)*cos(i*pi*x) +
b(i)*sin(i*pi*x), (i, 1, n))
return sums
SymPy は優秀で,絶対値 abs(x)
を含む積分でも特に問題なく積分値を返してくれる。たとえば,a(3)
や Fourier(3)
は…
In [7]:
a(3)
Out[7]:
In [8]:
Fourier(3)
Out[8]:
フーリエ係数
フーリエ係数 $a_n, b_n$ は…
In [9]:
a(n)
Out[9]:
In [10]:
b(n)
Out[10]:
$a_n$ は $n$ の偶奇によってゼロになる場合があるので,$n=10$ まで表示してみる。
In [11]:
for n in range(11):
print('a(%2d) = ' % n, a(n))
フーリエ級数のグラフ
$n = 3, 5, 7$ のフーリエ級数を求め,グラフにしてみる。
In [12]:
f3 = Fourier(3)
f5 = Fourier(5)
f7 = Fourier(7)
plot(
(f, "$f(x)$"),
(f3, "$n=3$"),
(f5, "$n=5$"),
(f7, "$n=7$"), (x, -5, 5), {"lw":1},
xlim = (-5, 6.5), ylabel = False);
$n=15$ くらいだと,かなり $f(x)$ に近い感じがあらわれている。
In [13]:
f15 = Fourier(15)
plot(
(f, "$f(x)$"),
(f15, "$n=15$"), (x, -5, 5), {"lw":1},
xlim = (-5, 6.5), ylabel = False);
In [14]:
s = fourier_series(f0(x), (x, -1, 1))
ためしに,フーリエ級数の最初から(ゼロでない)5項を出力してみます。
In [15]:
s.truncate(n = 5)
Out[15]:
我々が定義した Fourier(n)
では n=7
に相当します。(n
が偶数の場合は a(n)
がゼロであったことに注意。)
In [16]:
Fourier(7)
Out[16]: