関数の級数展開

再帰定義を利用することで、関数の級数展開の部分和をプロットすることができます。

再帰定義を用いた関数和の定義

実数xと整数nを引数に持つある関数func(x,n)n=0からn=Nまで積分するための関数series(x,N)は以下のようにして定義することができます。

series(x,N) = (N > 0 ? series(x,N-1)+func(x,N) : func(x,0) )

上記の再帰定義を展開するとseries(x,N)=func(x,N)+func(x,N-1)+...+func(x,0)となりますので、関数の和が定義できたことになります。

関数の級数展開の例

以下では幾つかの例を示していきます。

まず、正弦関数のべき級数展開

の例は以下の通りです。

# 級数和を再帰定義
series(x,N) = (N > 0 ? series(x,N-1)+func(x,N) : func(x,0) )
# 級数の各項
func(x,n)=(-1)**n*x**(2*n+1)/(2*n+1)! 

set yrange [-1:1]
set samples 1000
plot series(x,1), series(x,3), series(x,10), series(x,20), sin(x)

このスクリプトを実行すると以下のようになります。series(x,N)関数のNの値が大きいほど和がsin(x)に近付いていることが分かります。

次に、矩形波のFourier展開

の例を示します。

# 級数和を再帰定義
series(x,N) = (N > 1 ? series(x,N-1)+func(x,N) : func(x,1) )
# 級数の各項
func(x,n)=(n==0 ? 0.0 : 2.0/pi*(1-(-1)**n)*sin(n*x)/n)
# 階段関数
step(x)=(-1)**int(floor(x/pi))

set samples 1000
plot series(x,3), series(x,10), series(x,20), series(x,80), step(x)

上記例でseries(x,N)の定義中の01に変更されているのに注意して下さい。これは、級数の初項が1であるためです。

このスクリプトの実行結果は以下の通りで、やや収束性は悪いものの、Nが大きくなるにつれて矩形波に近づいていくことが分かります。

最後に、第一種ベッセル関数の展開

のうち、ν=1の場合を試してみます。

# 級数和を再帰定義
series(x,N) = (N > 0 ? series(x,N-1)+func(x,N) : func(x,0) )
# 級数の各項
func(x,n)=(-1)**n*(x*0.5)**(2*n+1)/(gamma(n+2)*n!)

set samples 1000
set xrange [0:50]
set yrange [-1:1]
plot series(x,3), series(x,10), series(x,20), series(x,80), besj1(x)

2次元関数の級数展開なども当然上記の方法で行うことができます。それを用いた例が磁束格子の図です。