Return to Maxima でフーリエ解析

Maxima でフーリエ級数展開の例題を解く

フーリエ級数展開の例題

区間 $[-1: 1]$ で定義された関数 $f(x) = 1 – |x|$ が区間外では周期 $2$ の周期関数だとして,そのフーリエ級数展開を求める。

In [1]:
/* -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));
Out[1]:
\[\tag{${\it \%o}_{1}$}f_{0}\left(x\right):=1-\left| x\right| \]
Out[1]:
\[\tag{${\it \%o}_{2}$}{\it xcyc}\left(x , L\right):=x-2\,L\,\left \lfloor \frac{x+L}{2\,L} \right \rfloor\]
Out[1]:
\[\tag{${\it \%o}_{3}$}f\left(x\right):=f_{0}\left({\it xcyc}\left(x , 1\right)\right)\]

区間 $-1 \le x \le 1$ で定義された関数 $f_0(x)$ と,周期 $2$ の周期関数 $f(x)$ をそれぞれグラフにしてみる。

In [2]:
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)"])$

定義どおりにフーリエ級数展開を定義すると以下のようになるが…

In [3]:
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);
Out[3]:
\[\tag{${\it \%o}_{9}$}a\left(n , L\right):=\frac{1}{L}\,{\it integrate}\left(f_{0}\left(x\right)\,\cos \left(\frac{n\,\pi\,x}{L}\right) , x , -L , L\right)\]
Out[3]:
\[\tag{${\it \%o}_{10}$}b\left(n , L\right):=\frac{1}{L}\,{\it integrate}\left(f_{0}\left(x\right)\,\sin \left(\frac{n\,\pi\,x}{L}\right) , x , -L , L\right)\]
Out[3]:
\[\tag{${\it \%o}_{11}$}{\it Fourier}\left(n , x , L\right):=\frac{a\left(0\right)}{2}+{\it sum}\left(a\left(i , L\right)\,\cos \left(\frac{i\,\pi\,x}{L}\right)+b\left(i , L\right)\,\sin \left(\frac{i\,\pi\,x}{L}\right) , i , 1 , n\right)\]

だとえば $a_1 = $ a(1,1) の計算をみればわかるように,絶対値を含む積分はそのままではだめ。

In [4]:
a(1,1);
Out[4]:
\[\tag{${\it \%o}_{12}$}\int_{-1}^{1}{\left(1-\left| x\right| \right)\,\cos \left(\pi\,x\right)\;dx}\]

人の手で積分するときと同様に,場合分けで絶対値をはずす,つまり $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$$

In [5]:
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$ は…

In [6]:
a(n,1);
Out[6]:
\[\tag{${\it \%o}_{18}$}\frac{2}{\pi^2\,n^2}-\frac{2\,\left(-1\right)^{n}}{\pi^2\,n^2}\]
In [7]:
b(n,1);
Out[7]:
\[\tag{${\it \%o}_{19}$}0\]

$a_n$ は $n$ の偶奇によってゼロになる場合があるので,$n=10$ まで表示してみる。

In [8]:
for i:0 thru 10 do(print("a(",i,")=", a(i,1)))$
a( \(0\) )= \(1\)
a( \(1\) )= \(\frac{4}{\pi^2}\)
a( \(2\) )= \(0\)
a( \(3\) )= \(\frac{4}{9\,\pi^2}\)
a( \(4\) )= \(0\)
a( \(5\) )= \(\frac{4}{25\,\pi^2}\)
a( \(6\) )= \(0\)
a( \(7\) )= \(\frac{4}{49\,\pi^2}\)
a( \(8\) )= \(0\)
a( \(9\) )= \(\frac{4}{81\,\pi^2}\)
a( \(10\) )= \(0\)

$n = 3, 5, 7$ のフーリエ級数を求め,グラフにしてみる。

In [9]:
f3: Fourier(3,x,1);
f5: Fourier(5,x,1);
f7: Fourier(7,x,1);
Out[9]:
\[\tag{${\it \%o}_{21}$}\frac{4\,\cos \left(3\,\pi\,x\right)}{9\,\pi^2}+\frac{4\,\cos \left(\pi\,x\right)}{\pi^2}+\frac{1}{2}\]
Out[9]:
\[\tag{${\it \%o}_{22}$}\frac{4\,\cos \left(5\,\pi\,x\right)}{25\,\pi^2}+\frac{4\,\cos \left(3\,\pi\,x\right)}{9\,\pi^2}+\frac{4\,\cos \left(\pi\,x\right)}{\pi^2}+\frac{1}{2}\]
Out[9]:
\[\tag{${\it \%o}_{23}$}\frac{4\,\cos \left(7\,\pi\,x\right)}{49\,\pi^2}+\frac{4\,\cos \left(5\,\pi\,x\right)}{25\,\pi^2}+\frac{4\,\cos \left(3\,\pi\,x\right)}{9\,\pi^2}+\frac{4\,\cos \left(\pi\,x\right)}{\pi^2}+\frac{1}{2}\]
In [10]:
plot2d([f(x), f7, f5, f3], [x, -3, 4], 
       [legend, "f(x)", "n=7", "n=5", "n=3"])$

$n=15$ くらいだと,かなり $f(x)$ に近い感じがあらわれている。

In [11]:
plot2d([f(x), Fourier(15,x,1)], [x, -3, 4], 
       [legend, "f(x)", "n=15"])$

参考:fourie パッケージを使う場合

In [12]:
load("fourie")$ /* パッケージ名注意! fourier ではない。*/
In [13]:
f0(x):= 1 - abs(x);
Out[13]:
\[\tag{${\it \%o}_{29}$}f_{0}\left(x\right):=1-\left| x\right| \]

やってみればわかるが,絶対値の場合分けをしなくても,このパッケージは優秀で,きちんとフーリエ係数を求めてくれるようだ。ありがたい。

In [14]:
declare(n, integer)$
ans: fourier(f0(x), x, 1)$
\[\tag{${\it \%t}_{31}$}a_{0}=\frac{1}{2}\]
\[\tag{${\it \%t}_{32}$}a_{n}=2\,\left(\frac{1}{\pi^2\,n^2}-\frac{\left(-1\right)^{n}}{\pi^2\,n^2}\right)\]
\[\tag{${\it \%t}_{33}$}b_{n}=0\]