フーリエ級数
- 区間 $-\pi < x < \pi$ で定義された関数 $f(x)$ は,それがどんな関数であっても…
- 区間外では,周期 $ 2\pi $ の周期関数とみなして
- 三角関数 $\cos, \ \sin$ の重ね合わせて表すことができる!
つまり,以下のように書けるということ。
$$ f(x) = \frac{a_0}{2} + \sum_{n=1}^{\infty} \bigl( a_n \cos n x + b_n \sin nx \bigr) $$
ここで,フーリエ係数 $a_n, b_n$ は
$$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 $$
例題
区間 $[-\pi: \pi]$ で定義された関数 $f(x) = x^2$ のフーリエ級数展開。
周期 $2 \pi$ の周期関数として,
- $[-3\pi:-\pi]$ では $f(x) = (x+2 \pi)^2$…
- $[-\pi:\pi]$ では $f(x) = x^2$,
- $[\pi:3\pi]$ では $f(x) = (x-2 \pi)^2$…
のようにすればいい。
まず,1周期分の $f_0(x) \equiv x^2$ を定義して,$[-\pi:\pi]$ の区間でグラフを描く。
f0(x):= x**2;
plot2d(f0(x), [x, -%pi, %pi])$
$[-\pi:\pi]$ の区間外では,周期 $2 \pi$ の周期関数として,
- $[-3\pi:-\pi]$ では $f(x) = (x+2 \pi)^2$…
- $[-\pi:\pi]$ では $f(x) = x^2$,
- $[\pi:3\pi]$ では $f(x) = (x-2 \pi)^2$…
をグラフに描くために,ちょっと工夫をします。(詳細は省きますが,$x$ の異なる範囲ごとに異なる関数のグラフを重ねて描くため,媒介変数表示 parametric
でプロットしています。)
plot2d([parametric, t, f0(t), [t, -%pi, %pi]],
[x, -3*%pi, 3*%pi]
)$
plot2d([[parametric, x, f0(x + 2*%pi), [x, -3*%pi, -%pi]],
[parametric, x, f0(x), [x, -%pi, %pi]],
[parametric, x, f0(x - 2*%pi), [x, %pi, 3*%pi]]
], [x, -3*%pi, 3*%pi]
)$
周期毎に別の関数を描くのは面倒なので,切り捨てる関数 floor()
を使って周期 $2\pi$ の関数 $f(x)$ を定義します。
f(x):= f0(x - 2*%pi*floor((x+%pi)/(2*%pi)));
何これ?と思った人もいるかもしれないが,実際にグラフを描くと確かに周期関数になっていることがわかる。
関数 $f(x)$ を $a \leq x \leq b$ の範囲でグラフにするのは,Maxima では以下のように書く。
plot2d(f(x), [x, a, b]);
上で定義した周期関数 $f(x)$ を $-3\pi \leq x 3\pi$ の範囲でグラフを描くには…
plot2d(f(x), [x, -3*%pi, 3*%pi])$
少しオプションを設定して描く例:
以下の例では,
legend
で凡例を設定し,[y, -2, 12]
で縦軸の表示範囲を設定し,grid2d
でグリッド(格子線)を表示させる設定をし,[ylabel, ""]
で $y$ 軸のラベルをカラにし,[xtics, %pi]
で $x$ 軸の目盛りを $\pi$ ごとにし,- $x$ 軸のフォーマットを $\pi$ の倍数になるように設定しています。
plot2d(f(x), [x, -3*%pi, 3*%pi], [legend,"f(x)"], [y, -2, 12],
grid2d, [ylabel, ""],
[xtics, %pi], [gnuplot_preamble, "set format x '%4.1P π'"]
)$
参考までに,draw2d()
で描く例。
draw2d(
yrange = [-2, 12], grid = true,
xtics = %pi, user_preamble = "set format x '%4.1P π'",
key = "f(x)",
explicit(f(x), x, -3*%pi, 3*%pi)
)$
フーリエ級数は,以下のように書けました。
$$ f(x) = \frac{a_0}{2} + \sum_{n=1}^{\infty} \bigl( a_n \cos n x + b_n \sin nx \bigr) $$
ここで,フーリエ係数 $a_n, b_n$ は
$$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 $$
Maxima にはフーリエ級数を扱うパッケージ(load(fourie)$
)がありますが,簡単なので,積分と和をとる演算を以下のように定義してしまいます。
/* フーリエ係数の定義と計算。フーリエ級数の定義。*/
a(n):= 1/%pi * integrate(f0(x)*cos(n*x), x, -%pi, %pi);
b(n):= 1/%pi * integrate(f0(x)*sin(n*x), x, -%pi, %pi);
Fourier(n, x):= a(0)/2 + sum(a(i)*cos(i*x) + b(i)*sin(i*x), i, 1, n);
ちなみに,上のセルの定義で使われている関数 integrate()
は積分を実行し, sum()
は和をとり,説明は以下の通りです。
$\displaystyle \int_a^b f(x)\, dx = $ integrate(f(x), x, a, b);
$\displaystyle \sum_{i = 1}^n a_i = $ sum(a(i), i, 1, n);
$f(x) = x^2$ は偶関数なので,奇関数部分のフーリエ係数である $b_n$ はゼロのはず。実際に調べてみると…
declare(n, integer)$
b(1);
b(2);
b(3);
b(n);
a(0);
a(1);
a(2);
a(3);
a(n);
$n = 1, 2, 3, 4$ までのフーリエ級数展開をそれぞれ,f1
, f2
, f3
, f4
としてみます。
f1: Fourier(1, x);
f2: Fourier(2, x);
f3: Fourier(3, x);
f4: Fourier(4, x);
それぞれの次数までのフーリエ級数展開の式と,もとの周期関数 $f(x)$ を重ねてグラフにします。
plot2d([f(x), f1], [x, -3*%pi, 3*%pi], [legend,"f(x)", "n=1"],
[y, -2, 12],
grid2d, [ylabel, ""],
[xtics, %pi], [gnuplot_preamble, "set format x '%4.1P π'"]
)$
$n = 2, 3, 4, \dots$ についても,上のようなグラフを描いてみます。
plot2d([f(x), f4, f3, f2, f1], [x, -3*%pi, 3*%pi],
[legend,"f(x)", "n=4", "n=3", "n=2", "n=1"],
[y, -2, 12],
grid2d, [ylabel, ""],
[xtics, %pi], [gnuplot_preamble, "set format x '%4.1P π'"]
)$
任意の周期をもつ関数のフーリエ級数展開
周期 $2\pi$ の決め打ちのフーリエ級数ではなく,任意の周期をもつ場合は,一般に周期を $2L$ として…
$$ f(x) = \frac{a_0}{2} + \sum_{n=1}^{\infty} \bigl( a_n \cos \frac{n\pi x}{L} + b_n \sin \frac{n\pi x}{L} \bigr) $$$$a_n = \frac{1}{L} \int_{-L}^{L} f(x) \cos \frac{n\pi x}{L} \, d{x} $$$$b_n = \frac{1}{L} \int_{-L}^{L} f(x) \sin \frac{n\pi x}{L} \, d{x} $$
例題
区間 $[-1:1]$ で定義された関数 $f(x) = x$ が,区間外では周期 $2$ の周期関数であるとして,$n=5$ までのフーリエ級数展開を求める。
上記の式で $L = 1$ とすればよいから…
kill(x, L)$
xcyc(x, L):= x - 2*L*floor((x+L)/(2*L));
1区間1周期で $f_0(x)$ として定義された関数を,その区間外で周期 $2L$ の周期関数にするには,上記のような $x_{\rm cyc}$ を使えばよい。
f0(x):= x;
f(x):= f0(xcyc(x, 1));
plot2d(f(x), [x, -5, 5], [xtics, 1])$
a(n):= 1/L * integrate(f0(x)*cos(n*%pi*x/L), x, -L, L);
b(n):= 1/L * integrate(f0(x)*sin(n*%pi*x/L), x, -L, L);
Fourier(n, x):= a(0)/2 + sum(a(i)*cos(i*%pi*x/L) +
b(i)*sin(i*%pi*x/L), i, 1, n);
L: 1$
$f_0(x) = x$ は奇関数なので,偶関数部分のフーリエ係数である $a_n$ はゼロのはず。実際に調べてみると…
a(0);
a(1);
a(2);
a(3);
a(n);
b(1);
b(2);
b(3);
b(n);
f1: Fourier(1, x);
f5: Fourier(5, x);
plot2d([f(x), f1], [x, -5, 5], [legend, "f(x)", "n = 1"],
[y, -1.3, 1.3], grid2d
)$
$n = 2, 3, \dots$ の場合についてもグラフを描いてみます。
plot2d([f(x), Fourier(3, x), Fourier(2,x), Fourier(1, x)],
[x, -5, 5],
[legend, "f(x)", "n = 3", "n = 2", "n = 1"],
[y, -1.3, 1.8], grid2d
)$
フーリエ積分・フーリエ変換
任意の周期 $2L$ をもつ関数の複素フーリエ級数展開を,非周期的現象にまで拡張したものが「フーリエ積分」であり,フーリエ係数の拡張が「フーリエ変換」。
周期性のない関数に対する(連続極限としての)フーリエ積分
$$ f(x) = \frac{1}{2\pi} \int_{-\infty}^{\infty}\ F(k)\ e^{i k x}\ dk, \quad F(k) \equiv \int_{-\infty}^{\infty} f(x) \ e^{-i k x} \ dx $$
例題
以下の周期性のない関数 $f(x)$ のフーリエ変換 $F(k)$ を求めよ。
$$ f(x) = \begin{cases}
\frac{1}{a} & (|x| \leq \frac{a}{2}) \\
0 & (|x|> \frac{a}{2})
\end{cases}$$
次に,以下の極限を求めよ。$$ \lim_{a \rightarrow 0} F(k) =?$$
もし $\displaystyle |x| \leq \frac{a}{2}$ なら $\displaystyle \frac{1}{a}$ を返し,それ以外なら $0$ を返す関数 $f(x)$ の定義の例です。念のため block()
で囲みます。
kill(a)$
f(x, a):= block(if abs(x) <= a/2 then 1/a else 0);
/* グラフを描くために a = 2 としてみる。*/
plot2d(f(x, 2), [x, -5, 5], [y, -0.5, 1])$
$$ F(k) = \int_{-\infty}^{\infty} f(x) \ e^{-i k x} \ dx = \int_{-\frac{a}{2}}^{\frac{a}{2}} \frac{1}{a}\ e^{-i k x} \ dx$$ということを使って,フーリエ変換の無限積分を有限区間の積分にします。
F: integrate(1/a * exp(-%i*k*x), x, -a/2, a/2);
参考: demoivre()
関数。
exp(%i * x) = demoivre(exp(%i * x));
demoivre(F);
ans: expand(%);
'limit(ans, a, 0) = limit(ans, a, 0);
算数の問題として,
$$ \lim_{a \rightarrow 0} F(k) = \lim_{a \rightarrow 0} \frac{\sin\frac{ak}{2}}{\frac{ak}{2}} = 1$$
となることはわかった。では,フーリエ変換 $F(k)$ が $1$ となる $f(x)$ とはどのような関数であろうか。
以下のグラフから推察されるように,$a$ の値を小さくしていくと $f(x)$ は $x = 0$ の近くでのみ値をもつ関数になる。
$\displaystyle \int_{-\infty}^{\infty} f(x)\, dx =\int_{-\frac{a}{2}}^{\frac{a}{2}} \frac{1}{a} \,dx = 1$ という面積を保ちながら,$a \rightarrow 0$ で幅 $a$ がどんどん狭くなっていくため,高さ $\displaystyle \frac{1}{a}$ がどんどん高くなっていきます。
plot2d([f(x, 0.1), f(x, 0.2), f(x, 0.5), f(x, 2)],
[x, -5, 5], [y, -0.5, 10],
[legend, "a=0.1", "a=0.2", "a=0.5", "a=2"]
)$
この関数 $f(x)$ の $a \rightarrow 0$ の極限は,「デルタ関数」$\delta(x)$ と呼ばれます。定義は,(フーリエ変換 $F(k)$ が $1$ であるフーリエ積分であるから)
$$\delta(x) \equiv \frac{1}{2\pi} \int_{-\infty}^{\infty} e^{i k x}\ dk$$
デルタ関数は以下のような性質を持ちます。
$$\delta(x) = 0, \ \mbox{if $x \neq 0$}$$$$\int_{-\infty}^{\infty} g(x) \delta(x – c)\, dx = g(a)$$
特に,
$$\int_{-\infty}^{\infty} \delta(x)\, dx = 1$$
参考:fourie パッケージを使う場合
Maxima の fourie
パッケージを使ってフーリエ級数展開を行うには,最初に一度,load()
します。
load("fourie")$ /* パッケージ名注意! fourier ではない。*/
fourie
パッケージでは $\cos$ の係数の $a_0$ の定義が以下のように $1/2$ だけ異なることに注意。
$$ f(x) = a_0 + \sum_{n=1}^{\infty} \bigl( a_n \cos n x + b_n \sin nx \bigr) $$
-- Function: fourier (<f>, <x>, <p>)
Returns a list of the Fourier coefficients of '<f>(<x>)' defined on
the interval '[-p, p]'.
-- Function: totalfourier (<f>, <x>, <p>)
Returns 'fourexpand (foursimp (fourier (<f>, <x>, <p>)), <x>, <p>,
'inf)'.
例題
まず,1周期分の関数 $f_0(x)$ を定義する。
f0(x):= x**2;
$[-\pi: \pi]$ で定義された$f_0(x)$ が,区間外では周期 $2\pi$ の周期関数としたときのフーリエ係数を求めるには,関数 fourier(f0(x), x, %pi)
を使う。
/* すでに宣言済みだが,あらためて */
declare(n, integer)$
/* フーリエ係数を求める */
ans1: fourier(f0(x), x, %pi)$
/* ∞までの全展開を表示。fourier との重複表示も。 */
totalfourier(f0(x), x, %pi);
求めたフーリエ係数 ans1
を使って,$n = 1, 2, 3, 4$ までのフーリエ級数展開をそれぞれ,F1
, F2
, F3
, F4
として表示してみます。
F1: fourexpand(ans1, x, %pi, 1);
F2: fourexpand(ans1, x, %pi, 2);
F3: fourexpand(ans1, x, %pi, 3);
F4: fourexpand(ans1, x, %pi, 4);
例題
区間 $[-1:1]$ で定義された関数 $f(x) = x$ が,区間外では周期 $2$ の周期関数であるとして,$n=5$ までのフーリエ級数展開を求める。
f0(x):= x;
/* フーリエ係数を求める */
ans1: fourier(f0(x), x, 1)$
/* 求めたフーリエ係数を使って n = 5 まで表示 */
F5: fourexpand(ans1, x, 1, 5);