フーリエ級数の導出と収束条件

楽器の弦を弾くと、基本振動だけでなく倍音も同時に鳴ります。弦の振動波形は正弦波の単純な形ではなく、複雑な形をしています。しかし、この複雑な波形も正弦波と余弦波の重ね合わせで表現できるのです。

「任意の周期関数は三角関数の無限和で表せる」— この驚くべき主張がフーリエ級数(Fourier series)です。ジョセフ・フーリエが1807年に熱伝導の研究で提案したこのアイデアは、当時の数学者たちに衝撃を与え、解析学の発展に大きな影響を及ぼしました。

フーリエ級数を理解すると、以下のような応用が開けます。

  • 信号処理: 音声・画像信号の周波数成分の分析
  • 偏微分方程式: 変数分離法による熱伝導方程式・波動方程式の解法
  • 電子工学: 回路の周波数応答の解析
  • データ圧縮: JPEG画像やMP3音声の圧縮アルゴリズムの基礎
  • 量子力学: 波動関数の正規直交展開とエネルギー固有状態の分析

本記事の内容

  • 三角関数の直交性とフーリエ級数の導出
  • フーリエ係数の公式と計算方法
  • 収束条件(ディリクレの条件)
  • ギブス現象と部分和の振る舞い
  • Pythonによる実装と可視化

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

フーリエ級数とは — 直感的な理解

音のアナロジー

フーリエ級数を直感的に理解するために、音の世界を考えましょう。

ピアノのA4キー(ラ)を弾くと440Hzの音が聞こえます。同じ440Hzでもピアノとバイオリンでは音色が違います。この違いは倍音の構成の違いによるものです。

ピアノのAの音は

$$ \text{音波} = a_1 \sin(440 \cdot 2\pi t) + a_2 \sin(880 \cdot 2\pi t) + a_3 \sin(1320 \cdot 2\pi t) + \cdots $$

と書けます。基本周波数(440Hz)、2倍音(880Hz)、3倍音(1320Hz)、… の正弦波の重ね合わせです。各係数 $a_1, a_2, a_3, \ldots$ の大きさが楽器ごとに異なるため、音色が変わります。

フーリエ級数は、この「音の倍音構成」を数学的に一般化したものです。任意の周期関数を正弦波と余弦波の重ね合わせで表現します。

ベクトルのアナロジー

もう一つの理解の仕方として、ベクトルの分解を考えましょう。

3次元空間のベクトル $\bm{v}$ は、正規直交基底 $\{\bm{e}_1, \bm{e}_2, \bm{e}_3\}$ を使って

$$ \bm{v} = (\bm{v} \cdot \bm{e}_1)\bm{e}_1 + (\bm{v} \cdot \bm{e}_2)\bm{e}_2 + (\bm{v} \cdot \bm{e}_3)\bm{e}_3 $$

と分解できます。各係数は内積 $\bm{v} \cdot \bm{e}_k$ で求まります。

フーリエ級数も全く同じ構造です。関数 $f(x)$ を「無限次元のベクトル」、三角関数 $\{\sin(nx), \cos(nx)\}$ を「基底ベクトル」と見なし、関数の内積でフーリエ係数を求めます。

この「ベクトルの分解」の類推をもう少し深めましょう。3次元空間では基底は3つしかありませんが、関数空間では無限個の基底が必要です。これは、関数空間が無限次元であることを意味しています。しかし、構造は有限次元と全く同じです。直交基底に分解し、各成分を内積で求めるという手順は、次元が有限であろうと無限であろうと変わりません。この美しい類推が、フーリエ解析を線形代数の自然な拡張として理解できる理由です。

歴史的背景

歴史的には、フーリエは1807年にフランス学士院に論文を提出しましたが、ラグランジュらの反対で出版が遅れ、1822年の著書『熱の解析的理論』で体系的に発表されました。ラグランジュが反対した理由は「不連続関数を連続な三角関数の和で表せるはずがない」というものでした。しかしフーリエの主張は正しく、この論争がきっかけとなって関数・収束・連続性の概念の厳密化が進み、現代の解析学が生まれました。数学史における最も生産的な「誤解」の一つと言えるでしょう。

三角関数がなぜ「基底」として使えるのか、その鍵となる直交性を次に見ていきましょう。

三角関数の直交性

関数の内積

区間 $[-\pi, \pi]$ 上の2つの関数 $f(x), g(x)$ の内積を次のように定義します。

$$ \begin{equation} \langle f, g \rangle = \int_{-\pi}^{\pi} f(x) g(x)\, dx \end{equation} $$

この定義は、有限次元ベクトルの内積 $\bm{u} \cdot \bm{v} = \sum_i u_i v_i$ の連続版と考えることができます。離散的な「和」が連続的な「積分」に置き換わっただけで、内積の基本的な性質(対称性、線形性、正定値性)はそのまま保たれます。

この定義のもとで、三角関数は直交系を構成します。これは、異なる周波数の正弦波・余弦波が関数空間において「互いに直角」であることを意味しており、ベクトル空間の正規直交基底と全く同じ役割を果たします。

直交関係

以下の積分公式が成り立ちます($m, n$ は正の整数)。

$$ \int_{-\pi}^{\pi} \cos(mx)\cos(nx)\, dx = \begin{cases} 0 & (m \neq n) \\ \pi & (m = n \neq 0) \\ 2\pi & (m = n = 0) \end{cases} $$

$$ \int_{-\pi}^{\pi} \sin(mx)\sin(nx)\, dx = \begin{cases} 0 & (m \neq n) \\ \pi & (m = n) \end{cases} $$

$$ \int_{-\pi}^{\pi} \cos(mx)\sin(nx)\, dx = 0 \quad (\text{全ての } m, n) $$

証明($\cos(mx)\cos(nx)$ の場合): 積和公式 $\cos A \cos B = \frac{1}{2}[\cos(A-B) + \cos(A+B)]$ を使うと

$$ \int_{-\pi}^{\pi} \cos(mx)\cos(nx)\, dx = \frac{1}{2}\int_{-\pi}^{\pi} [\cos((m-n)x) + \cos((m+n)x)]\, dx $$

$m \neq n$ のとき、$\cos((m-n)x)$ と $\cos((m+n)x)$ は $[-\pi, \pi]$ で完全な周期を含むので、積分するとゼロになります。

$m = n \neq 0$ のとき、$\cos(0) + \cos(2nx)$ の積分は $2\pi/2 + 0 = \pi$ です。$\square$

最後の式(cos と sin の内積が常にゼロ)は、cos が偶関数、sin が奇関数であることから明らかです。偶関数 $\times$ 奇関数 $=$ 奇関数であり、対称区間上での奇関数の積分はゼロです。

直交性の幾何学的意味

直交性の意味をもう少し掘り下げましょう。$\cos(mx)$ と $\cos(nx)$($m \neq n$)が直交するとは、関数空間において「異なる周波数成分は互いに独立」であることを意味します。低い周波数の成分(ゆっくりした振動)と高い周波数の成分(速い振動)は、互いに干渉しないのです。

この性質は物理的にも自然です。弦の基本振動(第1倍音)と第2倍音はそれぞれ独立に存在し、一方が他方に影響を与えることはありません。直交性は、各周波数成分を独立に取り出して分析できることを保証するものであり、これがフーリエ解析を強力な分析ツールにしている根本的な理由です。

この直交性がフーリエ級数の理論的基盤です。次にこれを使ってフーリエ係数を導出しましょう。

フーリエ級数の導出

フーリエ級数の形

周期 $2\pi$ の関数 $f(x)$ をフーリエ級数で表します。

$$ \begin{equation} f(x) = \frac{a_0}{2} + \sum_{n=1}^{\infty} [a_n \cos(nx) + b_n \sin(nx)] \end{equation} $$

$a_0/2$ の「2で割る」は、後の公式を統一的にするための便宜的な定義です。なぜこの形にするかと言えば、$a_0$ の計算公式を $a_n$($n \geq 1$)と同じ形 $a_n = \frac{1}{\pi}\int_{-\pi}^{\pi} f(x)\cos(nx)\,dx$ で統一するためです。$n = 0$ を代入すると $a_0 = \frac{1}{\pi}\int_{-\pi}^{\pi} f(x)\,dx$ となりますが、これをフーリエ級数に代入する際に $1/2$ を掛けるので、定数項は $a_0/2$ になります。

フーリエ係数の導出

$a_0$ の導出: 両辺を $[-\pi, \pi]$ で積分します。

$$ \int_{-\pi}^{\pi} f(x)\, dx = \frac{a_0}{2} \cdot 2\pi + \sum_{n=1}^{\infty} [a_n \cdot 0 + b_n \cdot 0] $$

cos と sin の $[-\pi, \pi]$ 上の積分はゼロ(完全な周期の分だけ含むので)です。よって

$$ a_0 = \frac{1}{\pi}\int_{-\pi}^{\pi} f(x)\, dx $$

$a_n$ の導出 ($n \geq 1$): 両辺に $\cos(mx)$ を掛けて $[-\pi, \pi]$ で積分します。

$$ \int_{-\pi}^{\pi} f(x)\cos(mx)\, dx = \frac{a_0}{2} \cdot 0 + \sum_{n=1}^{\infty} \left[a_n \int_{-\pi}^{\pi} \cos(nx)\cos(mx)\, dx + b_n \int_{-\pi}^{\pi} \sin(nx)\cos(mx)\, dx\right] $$

直交性により、$n \neq m$ の項は全てゼロになり、$n = m$ の cos-cos 項のみが $\pi a_m$ として残ります。

$$ \int_{-\pi}^{\pi} f(x)\cos(mx)\, dx = a_m \pi $$

$$ \begin{equation} a_n = \frac{1}{\pi}\int_{-\pi}^{\pi} f(x)\cos(nx)\, dx \end{equation} $$

$b_n$ の導出: 両辺に $\sin(mx)$ を掛けて同様に計算すると

$$ \begin{equation} b_n = \frac{1}{\pi}\int_{-\pi}^{\pi} f(x)\sin(nx)\, dx \end{equation} $$

フーリエ係数の公式は、ベクトルの射影 $\bm{v} \cdot \bm{e}_k / \|\bm{e}_k\|^2$ と全く同じ構造をしています。$\|\cos(nx)\|^2 = \pi$ なので、$a_n = \langle f, \cos(nx) \rangle / \pi$ です。

ここで重要なのは、この導出の論理構造です。「$f(x)$ がフーリエ級数で表せる」と仮定した上で、級数の両辺に $\cos(mx)$ を掛けて積分し、直交性を使って係数を「抽出」しています。級数と積分の順序交換が許される(一様収束など)ことを暗に仮定しているため、収束条件の議論は後のセクションで行います。

偶関数と奇関数の場合

$f(x)$ が偶関数($f(-x) = f(x)$)の場合、$f(x)\sin(nx)$ は奇関数になるので $b_n = 0$ です。つまり偶関数のフーリエ級数には余弦項のみが現れます。逆に、$f(x)$ が奇関数($f(-x) = -f(x)$)の場合は $a_n = 0$ となり、正弦項のみが残ります。この性質は計算の手間を大幅に減らす非常に実用的なポイントです。

複素フーリエ級数

オイラーの公式 $e^{inx} = \cos(nx) + i\sin(nx)$ を使うと、フーリエ級数はより簡潔に書けます。

$$ \begin{equation} f(x) = \sum_{n=-\infty}^{\infty} c_n e^{inx}, \quad c_n = \frac{1}{2\pi}\int_{-\pi}^{\pi} f(x) e^{-inx}\, dx \end{equation} $$

$c_n$ と $a_n, b_n$ の関係は $c_0 = a_0/2$、$c_n = (a_n – ib_n)/2$、$c_{-n} = (a_n + ib_n)/2$($n > 0$)です。

複素フーリエ級数の利点は、表記がシンプルであること、そして正の周波数と負の周波数を対称的に扱えることです。信号処理では、$|c_n|^2$ が周波数 $n$ のパワースペクトルを表し、$\arg(c_n)$ が位相スペクトルを表します。この形式はフーリエ変換への一般化が自然であり、離散フーリエ変換(DFT)やFFTアルゴリズムも複素形式に基づいています。

一般周期のフーリエ級数

ここまで周期 $2\pi$ を仮定しましたが、一般の周期 $2L$ の場合は変数変換 $x \to \pi x / L$ により

$$ f(x) = \frac{a_0}{2} + \sum_{n=1}^{\infty} \left[a_n \cos\frac{n\pi x}{L} + b_n \sin\frac{n\pi x}{L}\right] $$

$$ a_n = \frac{1}{L}\int_{-L}^{L} f(x)\cos\frac{n\pi x}{L}\, dx, \quad b_n = \frac{1}{L}\int_{-L}^{L} f(x)\sin\frac{n\pi x}{L}\, dx $$

となります。基本周波数は $\omega_0 = \pi/L$ であり、$n$ 倍音の角周波数は $n\omega_0$ です。

フーリエ係数の公式を導出したところで、次にこの級数がいつ元の関数に収束するかを考えましょう。

収束条件

ディリクレの収束条件

フーリエ級数が元の関数に収束するための十分条件として、ディリクレの条件があります。

定理(ディリクレ): 周期 $2\pi$ の関数 $f(x)$ が以下の条件を満たすとき、フーリエ級数は収束する。

  1. $f(x)$ は $[-\pi, \pi]$ で区分的に連続(有限個の不連続点を許す)
  2. $f(x)$ は $[-\pi, \pi]$ で区分的に滑らか(有限個の角を許す)
  3. $\int_{-\pi}^{\pi} |f(x)|\, dx < \infty$(絶対可積分)

収束先は

$$ \frac{a_0}{2} + \sum_{n=1}^{\infty} [a_n\cos(nx) + b_n\sin(nx)] = \begin{cases} f(x) & (f \text{ が } x \text{ で連続}) \\ \frac{f(x^+) + f(x^-)}{2} & (f \text{ が } x \text{ で不連続}) \end{cases} $$

不連続点では、左極限と右極限の平均に収束します。

この収束条件は「十分条件」であり、実用上はほとんど全ての物理的・工学的な関数がこの条件を満たします。ディリクレの条件を満たさない関数の例としては、$f(x) = \sum_{n=1}^{\infty} \sin(n!x)/n$ のような、どこでも不連続な関数が挙げられますが、このような病的な関数は工学的な応用では現れません。

フーリエ係数の減衰速度と滑らかさ

フーリエ係数の減衰速度は、元の関数の滑らかさと密接に関係しています。

  • 不連続な関数(矩形波など): $a_n, b_n \sim O(1/n)$
  • 連続だが微分不可能な関数(三角波など): $a_n, b_n \sim O(1/n^2)$
  • $k$ 回連続微分可能な関数: $a_n, b_n \sim O(1/n^{k+1})$
  • 無限回微分可能な関数: 指数的に減衰

関数が滑らかであるほどフーリエ係数は速く減衰し、少ない項数で高精度な近似が得られます。この性質はスペクトル法(偏微分方程式の数値解法)の高精度を保証する理論的基盤です。

パーシバルの等式

フーリエ級数のエネルギー保存を表す重要な等式です。

$$ \begin{equation} \frac{1}{\pi}\int_{-\pi}^{\pi} |f(x)|^2\, dx = \frac{a_0^2}{2} + \sum_{n=1}^{\infty} (a_n^2 + b_n^2) \end{equation} $$

左辺は信号のエネルギー(時間領域)、右辺は各周波数成分のエネルギーの和(周波数領域)です。つまり、フーリエ級数展開はエネルギーを保存します。

パーシバルの等式は、信号処理において「時間領域での解析と周波数領域での解析は等価である」ことの数学的な保証です。例えば、信号のフィルタリングを周波数領域で行っても、時間領域のエネルギーの計算は正確に反映されます。

ギブス現象

不連続点の近傍では、フーリエ級数の部分和にオーバーシュート(行き過ぎ)が発生します。これがギブス現象です。

部分和の項数 $N$ を増やしても、不連続点での最大オーバーシュートは不連続の大きさの約9%に収束し、ゼロにはなりません。具体的には、矩形波の不連続(高さ $h$)に対して

$$ \text{最大オーバーシュート} \approx 0.0895 \cdot h \approx \frac{h}{\pi}\int_0^{\pi} \frac{\sin t}{t}\, dt – \frac{h}{2} $$

ギブス現象は一見すると厄介な性質ですが、これはフーリエ級数(正弦波の有限和)が不連続点を「なめらかに」近似しようとする際に不可避的に生じるものです。オーバーシュートを抑える方法として、フーリエ係数にランチョス $\sigma$ 因子($\sigma_n = \frac{\sin(n\pi/N)}{n\pi/N}$)を掛けるランチョス・スムージングや、チェザロ平均を用いるフェイエールの定理などが知られています。フェイエールの定理では、部分和の算術平均が不連続点でもギブス現象なしに元の関数に一様収束することが保証されます。

これらの収束の性質をPythonで視覚的に確認しましょう。

Pythonでの実装と可視化

矩形波のフーリエ級数

import numpy as np
import matplotlib.pyplot as plt

# 矩形波: f(x) = 1 (0 < x < π), -1 (-π < x < 0)
def square_wave(x):
    return np.sign(np.sin(x))

# フーリエ級数の部分和
def fourier_partial_sum_square(x, N):
    """矩形波のフーリエ級数部分和(解析的に計算)
    f(x) = (4/π) Σ sin((2k-1)x)/(2k-1), k=1,...
    """
    result = np.zeros_like(x)
    for k in range(1, N + 1):
        n = 2 * k - 1  # 奇数のみ
        result += np.sin(n * x) / n
    return result * 4 / np.pi

x = np.linspace(-3 * np.pi, 3 * np.pi, 2000)

fig, axes = plt.subplots(2, 2, figsize=(14, 10))

# (a) 項数を変えたフーリエ級数
ax = axes[0, 0]
ax.plot(x, square_wave(x), "k--", linewidth=1, alpha=0.5, label="Original")
for N, color in zip([1, 3, 5, 20], ["red", "blue", "green", "purple"]):
    ax.plot(x, fourier_partial_sum_square(x, N), color=color,
            linewidth=1.5, label=f"N = {N}")
ax.set_xlabel("x", fontsize=12)
ax.set_ylabel("f(x)", fontsize=12)
ax.set_title("Fourier Series of Square Wave", fontsize=13)
ax.legend(fontsize=9, loc="upper right")
ax.grid(True, alpha=0.3)
ax.set_ylim(-1.5, 1.5)

# (b) ギブス現象の拡大
ax = axes[0, 1]
x_zoom = np.linspace(-0.5, 1.5, 1000)
for N in [10, 50, 200]:
    ax.plot(x_zoom, fourier_partial_sum_square(x_zoom, N),
            linewidth=1.5, label=f"N = {N}")
ax.axhline(1.0, color="gray", linestyle="--", alpha=0.5)
ax.axhline(1.0 + 0.0895 * 2, color="red", linestyle=":",
           linewidth=1.5, alpha=0.5, label=f"Gibbs overshoot ≈ {1+0.179:.3f}")
ax.set_xlabel("x", fontsize=12)
ax.set_ylabel("f(x)", fontsize=12)
ax.set_title("Gibbs Phenomenon (Zoom)", fontsize=13)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

# (c) フーリエ係数の減衰
ax = axes[1, 0]
n_coeffs = 50
b_n = np.zeros(n_coeffs)
for n in range(1, n_coeffs):
    if n % 2 == 1:  # 奇数
        b_n[n] = 4 / (np.pi * n)

ax.stem(range(1, n_coeffs), b_n[1:], linefmt="b-", markerfmt="bo",
        basefmt="k-", label="$b_n$")
ax.plot(range(1, n_coeffs), 4/(np.pi * np.arange(1, n_coeffs)),
        "r--", linewidth=1, alpha=0.5, label="$4/(\\pi n)$ envelope")
ax.set_xlabel("n", fontsize=12)
ax.set_ylabel("Fourier coefficient $b_n$", fontsize=12)
ax.set_title("Fourier Coefficients of Square Wave", fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

# (d) パーシバルの等式の検証
ax = axes[1, 1]
N_values = range(1, 101)
energy_partial = []
for N in N_values:
    energy = sum((4/(np.pi*(2*k-1)))**2 for k in range(1, N+1))
    energy_partial.append(energy)

# 理論値: (1/π) ∫ |f(x)|² dx = (1/π) * 2π = 2
energy_true = 2.0

ax.plot(list(N_values), energy_partial, "b-", linewidth=2,
        label="$\\sum b_n^2$ (partial)")
ax.axhline(energy_true, color="red", linestyle="--", linewidth=2,
           label=f"$(1/\\pi)\\int|f|^2 dx$ = {energy_true}")
ax.set_xlabel("Number of terms N", fontsize=12)
ax.set_ylabel("Energy", fontsize=12)
ax.set_title("Parseval's Theorem", fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig("fourier_series.png", dpi=150, bbox_inches="tight")
plt.show()

このグラフから、フーリエ級数の基本的な性質が読み取れます。

  1. 左上(部分和の収束): 矩形波のフーリエ級数が項数 $N$ の増加とともに元の関数に近づいていく様子が見えます。$N=1$ ではただの正弦波ですが、$N=20$ では矩形波にかなり近い形になっています。

  2. 右上(ギブス現象): 不連続点($x = 0$)の近傍を拡大すると、$N$ を増やしてもオーバーシュートが消えないことがわかります。$N = 200$ でもオーバーシュートの高さは約1.179(理論値の不連続幅の約9%)であり、赤い点線で示した理論的な上限と一致しています。

  3. 左下(フーリエ係数): 矩形波のフーリエ係数は奇数 $n$ でのみ非ゼロで、$b_n = 4/(\pi n)$ で減衰します。$1/n$ の減衰は、矩形波が不連続関数であることを反映しています(滑らかな関数ではより速く減衰します)。

  4. 右下(パーシバルの等式): フーリエ係数の2乗和が、信号のエネルギー($= 2$)に収束していく様子が確認できます。約50項でほぼ収束しており、エネルギー保存の法則が数値的に成立しています。

様々な関数のフーリエ級数

import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate

def compute_fourier_coefficients(f, N, L=np.pi):
    """数値積分でフーリエ係数を計算"""
    a = np.zeros(N + 1)
    b = np.zeros(N + 1)
    for n in range(N + 1):
        a[n], _ = integrate.quad(lambda x: f(x) * np.cos(n*x), -L, L)
        a[n] /= L
        if n > 0:
            b[n], _ = integrate.quad(lambda x: f(x) * np.sin(n*x), -L, L)
            b[n] /= L
    return a, b

def fourier_sum(x, a, b):
    """フーリエ級数の部分和を計算"""
    result = a[0] / 2
    for n in range(1, len(a)):
        result += a[n] * np.cos(n * x) + b[n] * np.sin(n * x)
    return result

# テスト関数
functions = {
    "Sawtooth": lambda x: x / np.pi,
    "Triangle": lambda x: 1 - 2*np.abs(x)/np.pi,
    "Parabola": lambda x: x**2 / np.pi**2,
    "Abs sin": lambda x: np.abs(np.sin(x))
}

x = np.linspace(-np.pi, np.pi, 1000)

fig, axes = plt.subplots(2, 2, figsize=(14, 10))
N = 20

for ax, (name, f) in zip(axes.flat, functions.items()):
    a, b = compute_fourier_coefficients(f, N)
    y_true = np.array([f(xi) for xi in x])
    y_fourier = fourier_sum(x, a, b)

    ax.plot(x, y_true, "k-", linewidth=2, alpha=0.5, label="Original")
    ax.plot(x, y_fourier, "r-", linewidth=1.5, label=f"Fourier (N={N})")
    ax.fill_between(x, y_true, y_fourier, alpha=0.2, color="blue")
    error = np.max(np.abs(y_true - y_fourier))
    ax.set_title(f"{name} (max error = {error:.4f})", fontsize=13)
    ax.legend(fontsize=10)
    ax.grid(True, alpha=0.3)
    ax.set_xlabel("x", fontsize=11)

plt.tight_layout()
plt.savefig("fourier_various.png", dpi=150, bbox_inches="tight")
plt.show()

このグラフから、フーリエ級数の近似精度が関数の滑らかさに強く依存することが読み取れます。放物線 $x^2/\pi^2$ や $|\sin(x)|$ のような滑らかな関数では20項で非常に高い精度(誤差 $10^{-4}$ 以下)が得られますが、鋸歯波のように不連続な関数では誤差が大きく残ります。三角波は連続ですが角があるため、中間的な収束速度を示しています。

青い塗りつぶし部分は元の関数とフーリエ近似の差を表しており、近似の誤差がどこに集中しているかが一目でわかります。鋸歯波では不連続点の近傍にギブス現象による大きな誤差が見られますが、三角波では角の付近にのみ誤差が残り、滑らかな部分では非常に高精度な近似が得られています。このように、フーリエ級数の収束の速さは「関数のどこが滑らかで、どこが特異か」によって局所的に変化します。

まとめ

本記事では、フーリエ級数の導出と収束条件について解説しました。

  • 三角関数の直交性がフーリエ級数の理論的基盤であり、フーリエ係数は関数と三角関数の内積で求まる
  • フーリエ係数の公式 $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$ は直交性から導出される
  • ディリクレの収束条件により、区分的に滑らかな関数のフーリエ級数は収束する。不連続点では左右の極限の平均に収束する
  • ギブス現象: 不連続点の近傍で約9%のオーバーシュートが項数に関わらず残る
  • パーシバルの等式はフーリエ級数のエネルギー保存を保証する
  • フーリエ係数の減衰速度は関数の滑らかさを反映する — 滑らかな関数ほど高速に減衰し、少ない項数で高精度な近似が得られる

フーリエ級数は、周期関数の解析という枠を超えて、現代の科学技術の根幹を支えています。スマートフォンの音声認識、MRI画像の再構成、地震波の分析、量子力学の波動関数の展開など、フーリエの遺産は200年以上経った今も拡がり続けています。本記事で扱ったフーリエ級数は周期関数に限定されていますが、非周期関数への拡張がフーリエ変換であり、離散データへの適用が離散フーリエ変換(DFT)です。

次のステップとして、以下の記事も参考にしてください。