再帰定義を利用することで、関数の級数展開の部分和をプロットすることができます。
実数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)
の定義中の0が1に変更されているのに注意して下さい。これは、級数の初項が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次元関数の級数展開なども当然上記の方法で行うことができます。それを用いた例が磁束格子の図です。