【Python×数学】Pythonでフーリエ級数展開!SymPyのfourier_seriesを使ってみよう



「フーリエ級数展開」を聞いたことはありますか?
周期的な関数を三角関数の和で表す手法で、信号処理や物理学、工学など幅広い分野で活用されています。
「数式が難しそう…」「手計算だと大変そう…」
そんなイメージを持つ人も多いかもしれませんが、Pythonの数式処理ライブラリ「SymPy」 を使えば、フーリエ級数展開を簡単に扱うことができます。
1. SymPyを使ったフーリエ級数展開
フーリエ級数展開は、周期関数を三角関数の無限級数で表現する手法です。この手法は信号処理や物理学、工学で幅広く使われています。Pythonの数式処理ライブラリ SymPy を使えば、フーリエ級数展開を簡単に扱うことができます。本記事では、SymPyを使ったフーリエ級数展開の基本操作を解説します。
1.1. フーリエ級数展開とは
フーリエ級数展開は、周期的な関数 \( f(x) \) を以下の形式で表すことを指します。
\[ f(x) = a_0 + \sum_{n=1}^\infty \left( a_n \cos(nx) + b_n \sin(nx) \right) \]
ここで、\( a_0, a_n, b_n \) はフーリエ係数と呼ばれる定数です。
Sympyでは、この計算を自動的に行うことができます。
2. 基本的なフーリエ級数展開の例
まず、周期関数 \( f(x) = x^2 \) をフーリエ級数展開してみます。
from sympy import symbols, fourier_series, pi
# 変数と関数の定義
x = symbols('x')
f = x**2
# フーリエ級数展開
f_series = fourier_series(f, (x, -pi, pi))
print("フーリエ級数展開:")
print(f_series)
このコードは、関数 \( x^2 \) を区間 \([-π, π]\) のフーリエ級数として展開します。fourier_series
関数は、式の形で結果を返します。

2.1. 高次項の無視
Sympyの truncate
メソッドを使えば、指定した項数までの級数展開を得られます。
# 高次項までのフーリエ級数
f_series_truncated = f_series.truncate(n=5)
print("フーリエ級数(5項まで):")
print(f_series_truncated)
truncate(n=5)
を指定すると、5項までの結果が表示されます。


3. フーリエ級数のグラフ表示
Sympyで生成したフーリエ級数をMatplotlibを使ってプロットし、元の関数との違いを視覚的に確認できます。SymPyで求めた関数をlambdifyを使って、numpyで使えるようにしています。
import matplotlib.pyplot as plt
import numpy as np
from sympy import lambdify
import japanize_matplotlib
# フーリエ級数をnumpy用に変換
f_approx = lambdify(x, f_series_truncated, 'numpy')
f_original = lambdify(x, f, 'numpy')
# プロット用のデータ生成
x_vals = np.linspace(-np.pi, np.pi, 500)
y_original = f_original(x_vals)
y_approx = f_approx(x_vals)
# プロット
plt.figure(figsize=(8, 5))
plt.plot(x_vals, y_original, label='元の関数', linestyle='--')
plt.plot(x_vals, y_approx, label='フーリエ級数近似 (5項)')
plt.legend()
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('フーリエ級数展開による近似')
plt.grid(True)
plt.show()
matplotlibで日本語が使えるように、japanize_matplotlibを使っています。

