フーリエ級数展開の例題
区間 $[-1: 1]$ で定義された関数 $f(x) = 1 – |x|$ が区間外では周期 $2$ の周期関数だとして,そのフーリエ級数展開を求める。
/* -L <= x <= L で定義された関数 f0(x) */
f0(x):= 1 - abs(x);
/* f0(x) を任意周期 2L の周期関数にする小道具 */
xcyc(x, L):= x - 2*L*floor((x+L)/(2*L));
/* L = 1 */
f(x):= f0(xcyc(x, 1));
区間 $-1 \le x \le 1$ で定義された関数 $f_0(x)$ と,周期 $2$ の周期関数 $f(x)$ をそれぞれグラフにしてみる。
plot2d(f0(x), [x, -1, 1], [x, -5, 5], [xtics, 1], [ylabel,"f0(x)"])$
plot2d(f(x), [x, -5, 5], [xtics, 1], [ylabel,"f(x)"])$
定義どおりにフーリエ級数展開を定義すると以下のようになるが…
declare(n, integer)$
a(n,L):= 1/L * integrate(f0(x)*cos(n*%pi*x/L), x, -L, L);
b(n,L):= 1/L * integrate(f0(x)*sin(n*%pi*x/L), x, -L, L);
Fourier(n,x,L):= a(0)/2 + sum(a(i,L)*cos(i*%pi*x/L) +
b(i,L)*sin(i*%pi*x/L), i, 1, n);
だとえば $a_1 = $ a(1,1)
の計算をみればわかるように,絶対値を含む積分はそのままではだめ。
a(1,1);
人の手で積分するときと同様に,場合分けで絶対値をはずす,つまり $x < 0$ なら $f_0(x) = 1 – |x| = 1 + x $,$x > 0 $ なら $f0(x) = 1 – |x| = 1 – x$ のようにする。
つまり,$L = 1$ として,積分区間を分けて以下のようにする。積分区間を正の区間と負の区間に分けることによって,絶対値を含む関数 $f_0(x)$ でもちゃんと積分してくれるようだ。
$$\int_{-1}^1 f_0(x) \cos\left(n\pi x\right)\,dx = \int_{-1}^0 f_0(x) \cos\left(n\pi x\right)\,dx + \int_{0}^1 f_0(x) \cos\left(n\pi x\right)\,dx$$
a(n,L):= 1/L * (integrate(f0(x)*cos(n*%pi*x/L), x, -L, 0) +
integrate(f0(x)*cos(n*%pi*x/L), x, 0, L))$
b(n,L):= 1/L * (integrate(f0(x)*sin(n*%pi*x/L), x, -L, 0) +
integrate(f0(x)*sin(n*%pi*x/L), x, 0, L))$
Fourier(n,x,L):= a(0,L)/2 + sum(a(i,L)*cos(i*%pi*x/L) +
b(i,L)*sin(i*%pi*x/L), i, 1, n)$
フーリエ係数 $a_n, b_n$ は…
a(n,1);
b(n,1);
$a_n$ は $n$ の偶奇によってゼロになる場合があるので,$n=10$ まで表示してみる。
for i:0 thru 10 do(print("a(",i,")=", a(i,1)))$
$n = 3, 5, 7$ のフーリエ級数を求め,グラフにしてみる。
f3: Fourier(3,x,1);
f5: Fourier(5,x,1);
f7: Fourier(7,x,1);
plot2d([f(x), f7, f5, f3], [x, -3, 4],
[legend, "f(x)", "n=7", "n=5", "n=3"])$
$n=15$ くらいだと,かなり $f(x)$ に近い感じがあらわれている。
plot2d([f(x), Fourier(15,x,1)], [x, -3, 4],
[legend, "f(x)", "n=15"])$
参考:fourie パッケージを使う場合
load("fourie")$ /* パッケージ名注意! fourier ではない。*/
f0(x):= 1 - abs(x);
やってみればわかるが,絶対値の場合分けをしなくても,このパッケージは優秀で,きちんとフーリエ係数を求めてくれるようだ。ありがたい。
declare(n, integer)$
ans: fourier(f0(x), x, 1)$